【问题标题】:GetPixel always return 0 on png imageGetPixel 在 png 图像上总是返回 0
【发布时间】:2017-08-18 14:38:09
【问题描述】:

当我使用GetPixel() 读取图像时,颜色值始终为黑色。我的图片是 png 图片。

我之前尝试将图像转换为位图,但没有成功。

我相信问题不是我的代码,因为我是否在 Paint 中打开 png 图像并只保存它。代码正确读取图像。

我像下面这样加载图像

myImage = new Bitmap(fileName);

我需要在这里阅读图片

private void LoadImageMap(Bitmap value){
        for (int col = 0; col < value.Width; col++)
        {
            for (int row = 0; row < value.Height; row++)
            {
                var color = value.GetPixel(col, row);

var 颜色始终为黑色。

Sample of the image...

【问题讨论】:

  • Image 到底是什么?为什么您将 Bitmap 传递到您的方法中然后完全忽略它?发布您的实际代码。你有 3 个不同的图像在周围传播:myImagevalueImage,完全不清楚你在用它们做什么。
  • 对不起Imagevalue参数

标签: c# .net image-processing c#-4.0 bitmap


【解决方案1】:

PNG 图像是透明的,当像素完全透明时,GetPixel() RGB 颜色的值为零。

然后我的代码需要if 来验证这个案例。

解决方案如下:

var color = value.GetPixel(x, y);

if(color.A.Equals(0))
{
    color = Color.White;
}

PNG 使用 ARGB 颜色,其中 A 表示 alpha 通道,无论 alpha 是否为零,该像素都具有完全透明性。

【讨论】:

  • 从技术上讲,像素可以完美地设置颜色,但仍将其 Alpha 设置为 0,请注意。见en.wikipedia.org/wiki/File:Ipu.png
  • 不,这正是您图像中的问题。整个图像黑色,但数字周围的像素的 alpha 设置为 0。但它们的颜色值仍然是黑色。如果您在 Gimp 中打开图像并将 alpha 分割为图层蒙版,您可以看到图像像素都是 100% 黑色的。
【解决方案2】:

由于您将位图传递给代码,因此在调用GetPixel 时需要实际使用该变量。此外,在这种情况下不需要ref 关键字。

private void LoadImageMap(Bitmap value)
{
    for (int col = 0; col < value.Width; col++)
    {
        for (int row = 0; row < value.Height; row++)
        {
            var color = value.GetPixel(col, row);
        }
    }
}

【讨论】:

  • 我如何告诉我相信哪个代码是正确的,问题在于 png 图像格式,因为无论我将这个 png 保存在 Windows Paint 中,代码都会读取图像。
  • 我还尝试使用以下代码将 png 图像转换为 bmp 图像:using (var stream = new MemoryStream()) { repainted.Save(stream, ImageFormat.Bmp); var newImage = new Bitmap(stream, true); return newImage; }
  • 如果您的代码在您在 Paint 中打开并保存 .png 后可以正常工作,那么原始 .png 文件肯定有问题。它来自哪里?
  • 哈哈,我的 png 源不在我的生态系统中。我从一个网站上得到了 png。 png 是验证码图像。
猜你喜欢
  • 1970-01-01
  • 2015-09-06
  • 2014-04-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-16
  • 2015-09-27
相关资源
最近更新 更多