正在进行的是我需要在图像上绘制一个黑色矩形。我必须加载一个tif然后在它上面显示一个黑盒子。我得到了一些代码的帮助,但我不断得到错误:无法从具有索引像素格式的图像创建图形对象。
所以我不得不把它读成位格式,但是当我显示这个盒子时,它会调整盒子的大小。并且完全显示原始图像的所有黑色图片框。如果有人可以帮助我,我会出错,那将是非常棒的。
Bitmap original = (Bitmap)System.Drawing.Image.FromFile(coveted, true);
Bitmap newImage = new Bitmap(original.Width, original.Height);
pictureBox1.Image = newImage;
using (Graphics g = Graphics.FromImage(pictureBox1.Image))
{
using (SolidBrush brush = new SolidBrush(Color.Black))
{
g.FillRectangle(brush, new Rectangle(x1value, y1value, x3value, y3value));
}
}
我不确定如何让这个更清楚。发生的事情是我有一个不受支持的格式的tif。所以我必须将其更改为位图,以便我可以在其上绘制一个矩形。然后我需要在图片框中显示这个编辑过的图像(带有编辑的原始图像)。上面的代码是什么,一旦完成,它显示的是一个没有原始图像的黑盒。
我相信我从流中使用Bitmap然后关闭了流程。有人熟悉这个吗?
感谢STO会员的所有帮助!!如果您遇到错误“无法从具有索引像素格式的图像创建图形对象”,那么可以使用正确的代码来编辑图像。 如果您获得了编辑的起点(显然您必须使正则表达式适合您的情况):
//Regex for pulling points from a file
string x1 = x1 = Regex.Match(l, @"\r\n(\d+)\r\n(\d+)").Groups[2].Value;
string y1 = y1 = Regex.Match(l, @"\r\n(\d+)\r\n(\d+)\r\n(\d+)").Groups[3].Value;
string x2 = x2 = Regex.Match(l, @"\r\n(\d+)\r\n(\d+)\r\n(\d+)\r\n(\d+)").Groups[4].Value;
string y2 = y2 = Regex.Match(l, @"\r\n(\d+)\r\n(\d+)\r\n(\d+)\r\n(\d+)\r\n(\d+)").Groups[5].Value;
string x3 = x3 = Regex.Match(l, @"\r\n(\d+)\r\n(\d+)\r\n(\d+)\r\n(\d+)\r\n(\d+)\r\n(\d+)").Groups[6].Value;
string y3 = y3 = Regex.Match(l, @"\r\n(\d+)\r\n(\d+)\r\n(\d+)\r\n(\d+)\r\n(\d+)\r\n(\d+)\r\n(\d+)").Groups[7].Value;
{
//convert string to int for redacted points
int x1value = Convert.ToInt32(x1);
int y1value = Convert.ToInt32(y1);
int x3value = Convert.ToInt32(x3);
int y3value = Convert.ToInt32(y3);
{
//BEGIN Workaround for indexed pixels
Bitmap original = (Bitmap)System.Drawing.Image.FromFile(YOURFILE, true);
Bitmap newImage = new Bitmap(original);
pictureBox1.Image = newImage; //END Workaround for indexed pixels
using (Graphics g = Graphics.FromImage(pictureBox1.Image)) //start redaction
{
using (SolidBrush brush = new SolidBrush(Color.Black))
{
g.DrawImageUnscaled(newImage, 0,0);
g.FillRectangle(brush, new Rectangle(x1value, y1value, x3value, y3value));
}
} //End Redaction
pictureBox1.SizeMode = PictureBoxSizeMode.StretchImage; //Resized to fit into a static picturebox
}
}
答案 0 :(得分:2)
而不是
Bitmap newImage = new Bitmap(original.Width, original.Height);
你想要
Bitmap newImage = new Bitmap(original);
这将使您的newImage以原始内容开头。 不同之处在于你最终会得到newImage.PixelFormat == PixelFormat.Format32bppArgb,而我假设是original.PixelFormat == PixelFormat.Format1bppIndexed。 使用PixelFormat.Format32bppArgb,您可以创建Graphics对象;你不能用PixelFormat.Format1bppIndexed。
答案 1 :(得分:1)
这应该适合你:
original = (Bitmap)System.Drawing.Image.FromFile(coveted, true);
using (Graphics g = Graphics.FromImage(original))
{
using (SolidBrush brush = new SolidBrush(Color.Black))
{
g.FillRectangle(brush, new Rectangle(x1value, y1value, x3value, y3value));
}
}
pictureBox1.Image = original;
答案 2 :(得分:0)
您没有在newImage上绘制原始图像。
这样做:
g.DrawImageUnscaled(original, 0, 0);
另外,我会按如下方式进行,我认为在RAM中绘制更好,然后将其显示在屏幕上。也许我错了。
using (Graphics g = Graphics.FromImage(newImage))
{
g.DrawImageUnscaled(original, 0, 0);
using (SolidBrush brush = new SolidBrush(Color.Black))
{
g.FillRectangle(brush, new Rectangle(x1value, y1value, x3value, y3value));
}
}
pictureBox1.Image = newImage;
我没有测试过上面的代码..祝你好运。