【问题标题】:Changing the Opacity of a Bitmap image更改位图图像的不透明度
【发布时间】:2016-09-02 14:07:29
【问题描述】:

我有一个包含图像的表单。我正在使用滑块来更改图像的不透明度。因此,在滑块的“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...

【问题讨论】:

    标签: c# .net image image-processing


    【解决方案1】:

    ImageAttributes 方法适用于 PNG,因为原始帖子已列出它,但对于 JPEG,您需要先用颜色填充图形画布。由于这可能会留下一个不受欢迎的微小边框,因此只有在不透明度小于 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
    // ...
    

    【讨论】:

      【解决方案2】:

      从 CodeProject 试试这个 - Change Opacity of Image in C#:

      /// <summary>  
      /// method for changing the opacity of an image  
      /// </summary>  
      /// <param name="image">image to set opacity on</param>  
      /// <param name="opacity">percentage of opacity</param>  
      /// <returns></returns>  
      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;  
          }  
      } 
      

      【讨论】:

      • 您对参数 opacity 的注释说“不透明度的百分比”,但它不是百分比,它是一个绝对因子,即在 0.0 到 1.0 的范围内。
      • 我花了几个小时挖掘,但这是最终为我回答的帖子。谢谢!
      • 在数学上,65% 和 0.65 之间没有区别。它们是等价的。
      【解决方案3】:

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

          private const int bytesPerPixel = 4;
      
          /// <summary>
          /// Change the opacity of an image
          /// </summary>
          /// <param name="originalImage">The original image</param>
          /// <param name="opacity">Opacity, where 1.0 is no opacity, 0.0 is full transparency</param>
          /// <returns>The changed image</returns>
          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;
          }
      

      【讨论】:

      • 这应该是最好的答案!
      • 讨厌成为一个杀手,但如果图像无法修改,我会返回 null,以防您稍后处理结果。但是对 Jan 有很大帮助。谢谢 :)
      【解决方案4】:

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

      【讨论】:

      • 我有一些事情要澄清。如果我要遍历所有像素,那么它将消耗时间。有什么直接的方法吗? Thnx 及时回复
      • @JCTLK:当然会。它可以在小图像上快速完成。
      猜你喜欢
      • 2012-07-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-04
      • 2012-09-18
      • 1970-01-01
      相关资源
      最近更新 更多