2009-09-04 12 views
0

PanelコントロールのBackgroundImageとして使用するアルファチャンネルを持つ.pngファイルがあります。状況によっては、コントロールが無効になります。無効にすると、バックグラウンドイメージを50%透明にして、ユーザーがコントロールの状態に関する何らかの視覚的な表示を得るようにします。50%不透明度のビットマップを描画するにはどうすればよいですか?

誰も私がビットマップイメージを50%透明にする方法を知っていますか?

この段階では、ビットマップイメージを新しいビットマップに描画し、その上にパネルの背景色を使用して描画します。これは私の好みの解決策ではありません。

答えて

1

画像にアルファチャンネルを追加するコードです。 50%のアルファが必要な場合は、アルファ引数として128を設定します。

public static Bitmap AddAlpha(Bitmap currentImage, byte alpha) 
    { 
     Bitmap alphaImage; 
     if (currentImage.PixelFormat != PixelFormat.Format32bppArgb) 
     { 
      alphaImage = new Bitmap(currentImage.Width, currentImage.Height, PixelFormat.Format32bppArgb); 
      using (Graphics gr = Graphics.FromImage(tmpImage)) 
      { 
       gr.DrawImage(currentImage, 0, 0, currentImage.Width, currentImage.Height); 
      } 
     } 
     else 
     { 
      alphaImage = new Bitmap(currentImage); 
     } 

     BitmapData bmData = alphaImage.LockBits(new Rectangle(0, 0, alphaImage.Width, alphaImage.Height), 
      ImageLockMode.ReadWrite, PixelFormat.Format32bppArgb); 

     const int bytesPerPixel = 4; 
     const int alphaPixel = 3; 
     int stride = bmData.Stride; 

     unsafe 
     { 
      byte* pixel = (byte*)(void*)bmData.Scan0; 


      for (int y = 0; y < currentImage.Height; y++) 
      { 
       int yPos = y * stride; 
       for (int x = 0; x < currentImage.Width; x++) 
       { 
        int pos = yPos + (x * bytesPerPixel); 
        pixel[pos + alphaPixel] = alphaByte; 
       } 
      } 
     } 

     alphaImage.UnlockBits(bmData); 

     return alphaImage; 
    } 
+0

ありがとうございましたKris、私はMashalを使って少し変更しました.Copy、私は安全でないブロックは必要ありませんでしたが、それ以外の場合は治療になります。 – Kepboy

1

実際に透過率が50%の別の画像に置き換えることはできませんか?

+0

うん、それは考えなかった...これは、ビットマップのコピーを作成することに注意してください。 – Kepboy

0

.LockBitsを使用してイメージのピクセル値へのポインタを取得し、各ピクセルのアルパ値を変更することができます。この質問を参照してください: Gdiplus mask image from another image

関連する問題