c# - Mono 2.8.2 和加载 PNG 文件

标签 c# image-processing mono png

我正在做一个项目,在 Mono 2.8.2 中将多层 PNG 和生成的位图对象相互相加和相乘。

我遇到了一个问题,从 PNG 加载的像素是 (253, 252, 252, 153) (RGBA) 是 (151, 151, 151, 153)。这是对 PNG 没有的修改,只是加载它并在打印像素时循环遍历 x/y 坐标。看起来它正在拉取正确的 alpha,但不是正确的颜色值。

编辑 - 这是我正在处理的图像 http://i.stack.imgur.com/Gr21x.png

这或多或少是我正在做的:

Bitmap cover = new Bitmap("test.png");
for(int x = 0; x < cover.Width; x++)
{
    for(int y = 0; y < cover.Height; y++)
    {
        Color pixel = cover.GetPixel(x, y);
        Console.WriteLine("{0}x{1}: {2} {3} {4} {5}", x, y, pixel.R, pixel.G, pixel.B, pixel.A)
    }
}

我已经验证了我在 GIMP 中检查的值。对此有什么想法吗?我正在 Linux、Mono 2.8.2、libgdiplus-2.10 上进行开发。

谢谢!

最佳答案

刚找到这个:https://bugzilla.novell.com/show_bug.cgi?id=679242 .显然有一个针对这个问题的公开错误报告。

在此期间,任何主要为白色且带有 alpha 的 PNG 都可以在图像编辑程序中反转(因此它主要为黑色)、加载并在代码中重新反转。一个痛苦的屁股,但一个合适的解决方法,除非你的 PNG 包含白色和黑色的 alpha 值,或者上帝禁止颜色。

编辑:如错误报告中所述(请注意,这仅在 alpha 不为零时才有效):更好的方法是取消乘以颜色值:

r|g|b *= 255.0 / (double)alpha;

这可以通过创建一个 alpha 值为 150(或其他值)的白色单像素 PNG 来测试。加载图像,并测试其一个像素的 r/g/b 值是否小于 255。如果找到,则取消乘以所有加载的 PNG 的所有 alpha 值。如果找不到,请正常加载 PNG(无需修复)。这样即使修复了单声道错误,您的图像处理也不会以任何方式改变或中断。

关于c# - Mono 2.8.2 和加载 PNG 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5507534/

相关文章:

python - OpenCV cap.get(cv2.CAP_PROP_FRAME_COUNT)返回-1

android - Xamarin:找不到 "libmonodroid.so"模拟器错误

c# - Mono 和 PostgreSQL 兼容的论坛引擎?

c# - 在 C# MVC 中验证枚举值。发生部分验证 - 如何更改验证行为?

c# - 具有进程内托管的 Dotnet Core 多个启动类

c# - 免费/开放图书馆以查找相似图像

c++ - OpenCV 无法识别 Mat 大小

c# - 上传文件控件在后面的代码中不显示任何文件

c# - AutoFac 生命周期 : Force new instance in specific situation

mono - 有人在 Mono 下使用过任何 AOP 产品吗?