2012-07-11 77 views
4

我创建它画在我的基地png图片,从基础,我可以保存为PNG图像,供大家参考如何创建反向PNG图像?

Graphics g = e.Graphics; 
.... 
g.DrawLine(pen, new Point(x, y), new Point(x1, y1)); 
..... 
base.OnPaint(e); 

using (var bmp = new Bitmap(500, 50)) 
{ 
    base.DrawToBitmap(bmp, new Rectangle(0, 0, 500, 50)); 
    bmp.Save(outPath); 
} 

这是单色透明图像,现在我怎么能逆这个形象像PNG充满任何颜色,真实图像部分应该是透明的,有没有可能性?

详细一点:如此透明会去不透明,哪里有补会去透明

+0

我使用的载体,使极快的代码 [检查我的岗位更多信息](https://stackoverflow.com/a/44467764/6176081) – 2017-06-09 23:09:37

回答

5

编辑(thaks为Thomas符号)

public void ApplyInvert() 
{ 
    byte A, R, G, B; 
    Color pixelColor; 

    for (int y = 0; y < bitmapImage.Height; y++) 
    { 
     for (int x = 0; x < bitmapImage.Width; x++) 
     { 
      pixelColor = bitmapImage.GetPixel(x, y); 
      A = (byte)(255 - pixelColor.A); 
      R = pixelColor.R; 
      G = pixelColor.G; 
      B = pixelColor.B; 
      bitmapImage.SetPixel(x, y, Color.FromArgb((int)A, (int)R, (int)G, (int)B)); 
     } 
    } 
} 

从这里:Image Processing in C#: Inverting an image

+0

凉爽快速反应,让我试试这个,感谢利雅 – manny 2012-07-11 08:49:21

+0

如此接近! XD但请阅读帖子的最后一句话! – 2012-07-11 08:50:31

+0

不,我认为这是反转颜色(负),我的问题是反转透明的图像。所以透明将不透明,并且填充的位置将变为透明 – manny 2012-07-11 08:54:59

6

如果您愿意使用unsafe代码,则有更快捷的方法:

private unsafe void Invert(Bitmap bmp) 
{ 
    int w = bmp.Width, h = bmp.Height; 
    BitmapData data = bmp.LockBits(new Rectangle(0, 0, w, h), ImageLockMode.ReadWrite, PixelFormat.Format32bppArgb); 

    int* bytes = (int*)data.Scan0; 
    for (int i = w*h-1; i >= 0; i--) 
     bytes[i] = ~bytes[i]; 
    bmp.UnlockBits(data); 
} 

请注意,这并不关心颜色,也会反转这些颜色。如果你想使用特定的颜色,那么代码将不得不稍微修改。

+0

什么是不安全的? – manny 2012-07-11 08:58:58

+2

找到了一个链接。基本上它是一个使用指针的代码(就像那个'int *'那样)。 .NET运行时无法验证此代码不会执行某些愚蠢的操作,如编写未分配的内存,因此名称为“不安全”。因为如果你不小心,它会损坏程序存储器。为了编译这段代码,你必须在项目选项中启用不安全的代码(默认情况下它是关闭的),并且我认为也有一些安全隐患(不安全的代码在部分信任的程序集或其他东西中不起作用)。 – 2012-07-11 09:08:09

+0

你显示了一个有效的分数,是的,这是很好的检查。 – manny 2012-07-11 09:11:13

0

当你说反转透明部分为彩色,你是否在PNG图像中存储真正的颜色只是设置为完全透明?很多程序都会通过从透明度中移除颜色数据来优化png,所以您不能将其反转。

颜色可以转换为透明度 但透明度(无底色)不能转换为颜色。

如果您的幸运PNG未经过优化,仍然保留原始颜色数据,但如果您从用户输入中完成此操作,那么它将不适用于高比例的病例。

+0

是啊,我的是单色图像,要么是黑色要么是白色,所以反色会有相同的颜色,我担心alpha – manny 2012-07-11 10:39:18

5

谁想要反转的位图颜色不使用不安全的一个快速方法:

public static void BitmapInvertColors(Bitmap bitmapImage) 
{ 
    var bitmapRead = bitmapImage.LockBits(new Rectangle(0, 0, bitmapImage.Width, bitmapImage.Height), ImageLockMode.ReadOnly, PixelFormat.Format32bppPArgb); 
    var bitmapLength = bitmapRead.Stride * bitmapRead.Height; 
    var bitmapBGRA = new byte[bitmapLength]; 
    Marshal.Copy(bitmapRead.Scan0, bitmapBGRA, 0, bitmapLength); 
    bitmapImage.UnlockBits(bitmapRead); 

    for (int i = 0; i < bitmapLength; i += 4) 
    { 
     bitmapBGRA[i]  = (byte)(255 - bitmapBGRA[i]); 
     bitmapBGRA[i + 1] = (byte)(255 - bitmapBGRA[i + 1]); 
     bitmapBGRA[i + 2] = (byte)(255 - bitmapBGRA[i + 2]); 
     //  [i + 3] = ALPHA. 
    } 

    var bitmapWrite = bitmapImage.LockBits(new Rectangle(0, 0, bitmapImage.Width, bitmapImage.Height), ImageLockMode.WriteOnly, PixelFormat.Format32bppPArgb); 
    Marshal.Copy(bitmapBGRA, 0, bitmapWrite.Scan0, bitmapLength); 
    bitmapImage.UnlockBits(bitmapWrite); 
} 

位图GetPixel和SetPixel是的极端缓慢,这种方法通过位图像素复制到一个字节数组,你可以然后循环并更改,最终将像素复制回来。