2016-12-05 35 views
0

我有一个PNG图像上的按钮进行设置:如何反转图像

Button btn = new Button(); 
ImageBrush brush = new ImageBrush(); 
brush.ImageSource = new BitmapImage(new Uri(@"C:\temp\dog.png", UriKind.Relative)); 
btn.Background = brush; 

我想有它倒(意思是负面形象)。

喜欢的东西:

btn.Background = Invert(brush); 

感谢

+0

[反转图像在C#中更快(HTTP的可能重复://作为一个说明,UriKind.Relative的机智(#)(#)(#)stackoverflow.com/questions/33024881/invert-image-faster-in-c-sharp) –

+1

作为一个说明,UriKind.Relative机智h绝对URI看起来可疑。 – Clemens

+1

@AliBahrainezhad是winform,我使用wpf – Luca

回答

3

您可以使用下面的代码。请注意,它目前仅适用于每像素32位的PixelFormat,即Brg32,Bgra32Prgba32

public static BitmapSource Invert(BitmapSource source) 
{ 
    // Calculate stride of source 
    int stride = (source.PixelWidth * source.Format.BitsPerPixel + 7)/8; 

    // Create data array to hold source pixel data 
    int length = stride * source.PixelHeight; 
    byte[] data = new byte[length]; 

    // Copy source image pixels to the data array 
    source.CopyPixels(data, stride, 0); 

    // Change this loop for other formats 
    for (int i = 0; i < length; i += 4) 
    { 
     data[i] = (byte)(255 - data[i]); //R 
     data[i + 1] = (byte)(255 - data[i + 1]); //G 
     data[i + 2] = (byte)(255 - data[i + 2]); //B 
     //data[i + 3] = (byte)(255 - data[i + 3]); //A 
    } 

    // Create a new BitmapSource from the inverted pixel buffer 
    return BitmapSource.Create(
     source.PixelWidth, source.PixelHeight, 
     source.DpiX, source.DpiY, source.Format, 
     null, data, stride); 
} 

您现在可以使用这样的:

brush.ImageSource = Invert(new BitmapImage(new Uri(@"C:\temp\dog.png"))); 

所以 enter image description here 成为 enter image description here