更改位图图像的不透明度

我有一个有图像的表格。 我正在使用滑块来更改图像的不透明度。 所以在滑块的“ValueChanged”事件中,我调用以下方法来更改不透明度。

//Setting the opacity of the image public static Image SetImgOpacity(Image imgPic, float imgOpac) { Bitmap bmpPic = new Bitmap(imgPic.Width, imgPic.Height); Graphics gfxPic = Graphics.FromImage(bmpPic); ColorMatrix cmxPic = new ColorMatrix(); cmxPic.Matrix33 = imgOpac; ImageAttributes iaPic = new ImageAttributes(); iaPic.SetColorMatrix(cmxPic, ColorMatrixFlag.Default, ColorAdjustType.Bitmap); gfxPic.DrawImage(imgPic, new Rectangle(0, 0, bmpPic.Width, bmpPic.Height), 0, 0, imgPic.Width, imgPic.Height, GraphicsUnit.Pixel, iaPic); gfxPic.Dispose(); return bmpPic; } 

返回的图像设置为原始图像。

我的问题是图像的不透明度没有变化……如果有任何错误,请善意指出.. Thnx ……

从CodeProject尝试这个 – 在C#中更改图像的不透明度 :

 ///  /// method for changing the opacity of an image ///  /// image to set opacity on /// percentage of opacity ///  public Image SetImageOpacity(Image image, float opacity) { try { //create a Bitmap the size of the image provided Bitmap bmp = new Bitmap(image.Width, image.Height); //create a graphics object from the image using (Graphics gfx = Graphics.FromImage(bmp)) { //create a color matrix object ColorMatrix matrix = new ColorMatrix(); //set the opacity matrix.Matrix33 = opacity; //create image attributes ImageAttributes attributes = new ImageAttributes(); //set the color(opacity) of the image attributes.SetColorMatrix(matrix, ColorMatrixFlag.Default, ColorAdjustType.Bitmap); //now draw the image gfx.DrawImage(image, new Rectangle(0, 0, bmp.Width, bmp.Height), 0, 0, image.Width, image.Height, GraphicsUnit.Pixel, attributes); } return bmp; } catch (Exception ex) { MessageBox.Show(ex.Message); return null; } } 

循环像素并仅播放Alpha通道。 如果使用Bitmap.LockBits执行此操作,它实际上会非常快。

  private const int bytesPerPixel = 4; ///  /// Change the opacity of an image ///  /// The original image /// Opacity, where 1.0 is no opacity, 0.0 is full transparency /// The changed image public static Image ChangeImageOpacity(Image originalImage, double opacity) { if ((originalImage.PixelFormat & PixelFormat.Indexed) == PixelFormat.Indexed) { // Cannot modify an image with indexed colors return originalImage; } Bitmap bmp = (Bitmap)originalImage.Clone(); // Specify a pixel format. PixelFormat pxf = PixelFormat.Format32bppArgb; // Lock the bitmap's bits. Rectangle rect = new Rectangle(0, 0, bmp.Width, bmp.Height); BitmapData bmpData = bmp.LockBits(rect, ImageLockMode.ReadWrite, pxf); // Get the address of the first line. IntPtr ptr = bmpData.Scan0; // Declare an array to hold the bytes of the bitmap. // This code is specific to a bitmap with 32 bits per pixels // (32 bits = 4 bytes, 3 for RGB and 1 byte for alpha). int numBytes = bmp.Width * bmp.Height * bytesPerPixel; byte[] argbValues = new byte[numBytes]; // Copy the ARGB values into the array. System.Runtime.InteropServices.Marshal.Copy(ptr, argbValues, 0, numBytes); // Manipulate the bitmap, such as changing the // RGB values for all pixels in the the bitmap. for (int counter = 0; counter < argbValues.Length; counter += bytesPerPixel) { // argbValues is in format BGRA (Blue, Green, Red, Alpha) // If 100% transparent, skip pixel if (argbValues[counter + bytesPerPixel - 1] == 0) continue; int pos = 0; pos++; // B value pos++; // G value pos++; // R value argbValues[counter + pos] = (byte) (argbValues[counter + pos] * opacity); } // Copy the ARGB values back to the bitmap System.Runtime.InteropServices.Marshal.Copy(argbValues, 0, ptr, numBytes); // Unlock the bits. bmp.UnlockBits(bmpData); return bmp; } 

我不熟悉ImageAttributes方法,但您应该能够简单地遍历图像的所有像素并修改像素颜色的alpha分量。

ImageAttributes方法可以正常使用PNG,因为原始post已经列出了它,但是对于JPEG,你需要先用颜色填充图形canvas。 因为这会留下一个微小的不受欢迎的边框,只有在不透明度小于1.0时才这样做:

 if(opacity < 1.0) { // g is a Graphics object g.Clear(Color.White); } // set color matrix and draw image as shown in other posts // ...