C# Bitmap SetPixel

本文关键字:SetPixel Bitmap | 更新日期: 2023-09-27 18:17:38

我正试图为我的课程做一些作业,我在Bitmap对象上的SetPixel方法有问题。

            // Retrieve the image.
            image = new Bitmap(FileLocation);
            SobelImage = image;
            int x, y;
            // Loop through the images pixels to reset color.
            for (x = 0; x < image.Width; x++)
            {
                for (y = 0; y < image.Height; y++)
                {
                    Console.WriteLine(String.Format("At {0} : {1}, Brightness : {2}", x, y, image.GetPixel(x, y).GetBrightness()));

                    Pixel pixel = new Pixel(image.GetPixel(x, y).GetBrightness());
                    SobelImage.SetPixel(x, y, Color.FromArgb(image.GetPixel(x, y).R, 0, 0)); 
                 }
             }

请帮忙,这是例外:未处理的System类型异常。InvalidOperationException'在System.Drawing.dll中发生

附加信息:SetPixel不支持索引像素格式的图像

C# Bitmap SetPixel

由于错误信息显示这种类型的图像不支持SetPixel方法

您有一个带有索引颜色的图像格式,例如GIF或8位PNG,其中每个像素的颜色是调色板的索引。你不能改变像素的颜色,因为颜色实际上并没有存储在像素中。

要使用SetPixel方法,您可以创建一个新的空位图,它将是32位argb格式,并在其上绘制图像:

Bitmap newImage = new Bitmap(image.Width, image.Height);
using (Graphics graphics = Graphics.FromImage(newImage)) {
  graphics.DrawImage(image, 0, 0);
}

新镜像将支持SetPixel。请注意,保存图像时,图像格式会有所不同。

由于数据存储的方式不同,您不能在索引位图中设置单个像素。对于一个索引位图,RGB值来自一个表的索引,但这是一个单向的操作-你不能仅仅从RGB值获得一个索引,因为表在PutPixel操作时可能没有一个合适的值。在处理整个图像的同时,可以从RGB位图中的所有RGB值创建一个新表,这是相当昂贵的操作。

你需要用RGB格式创建一个新的位图,并在那里放置像素。

Bitmap newImage = new Bitmap(sourceImage.Width, sourceImagr.Height);

作为旁注,您应该在using构造中使用位图对象。