2011-01-24 3 views
17

У меня есть форма, которая имеет изображение. Я использую ползунок для изменения непрозрачности изображения. Поэтому в событии «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 ...

ответ

35

Попробуйте один из 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; 
    } 
} 
+0

Ваш комментарий к непрозрачности параметра говорит «процент непрозрачности», но это не процент, это абсолютный коэффициент, то есть в диапазоне от 0.0 до 1.0. – RenniePet

+0

Мне потребовалось несколько часов, чтобы выкопать, но это был пост, который, наконец, ответил мне. Благодаря! – samuelesque

+5

Математически нет разницы между 65% и 0,65. Они эквивалентны. –

2

Я не знаком с ImageAttributes подходом, но вы должны просто пропустить все пиксели изображения и изменить альфа-компонент цвета пикселя.

+1

У меня есть кое-что, чтобы уточнить. Если я пройду через все пиксели, тогда он будет потреблять время. Любой прямой способ? Thnx для быстрого ответа – JCTLK

+1

@JCTLK: Конечно, будет. Это можно сделать довольно быстро на небольших изображениях. – leppie

14

вас цикл по пикселям и играть только альфа-канал. Если вы сделаете это с помощью 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; 
    } 
+2

Это должно быть лучшим ответ! – buzznfrog

+0

Ненависть быть killjoy, но я бы вернул null, если изображение не может быть изменено, если вы избавляетесь от результата позже. Но отличная помощь. Спасибо. :) – Czeshirecat

-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 
// ... 
Смежные вопросы