图像上的C#编辑绘图

时间:2010-01-13 21:39:42

标签: c#

正在进行的是我需要在图像上绘制一个黑色矩形。我必须加载一个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
                            }
                        }

3 个答案:

答案 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;

我没有测试过上面的代码..祝你好运。