2010-12-11 9 views
0

私はそこにpngのあるピクチャボックスを持っています。しかし、BackColorを透明に設定しても、透明ではありません。どのようなアイデアが間違っているかもしれない? :)C#、どのように画像の背景を透明にするには?

alt text

ありがとう!

+0

スクリーンショットはデザイナーのものです - これはアプリケーションの実行時にも起こりますか? – Oded

+0

はい、あります。 :) – Rob

+0

画像に勾配があるようです。たとえあなたがアルファチャンネルに適切な色を見つけたとしても、その勾配は罪のように醜いでしょう。 – kenny

答えて

4

私も透明な画像に関する問題に直面しています。

コードで描画する必要があります。 私の質問A PictureBox Problem

EDITを参照してください:ペイントイベント(コントロール含む背景画像) 書き込みで

この

//If added your image in project's resources get from there OR your Image location 
    Image img = yourNamespace.Properties.Resources.yourPicture; 
    e.Graphics.DrawImage(img,50,50,100,100); 
+0

申し訳ありませんあなたのイメージを表示していません。今、Upadated –

2

PNGファイルの背景も透明である必要があります。これは、イメージ(png)ファイルを作成する際に行うことができます。

+0

PNGの背景が透明です。 BackColorとして他の色を設定すると、色が表示されます。そのため、png自体はOKです。 – Rob

+0

私はそれについていくつか検索しましたが、この問題に直面した他の人のようにも見えます。誰かがPictureBoxの代わりにPanelコントロールを使用するよう提案しました。それはあなたのための選択肢ですか? – Hps

-1

私が学んだことから、イメージ用のレイヤーを持たないため、Windowsフォーム内ではできません。だからWPFとしてそれを作る必要があります。 :)

0

をどのように背景を作成しましたか?それはForm.BackgroundImageを設定して設定されていますか? その背景(紙のような画像)がコンテナコントロールである場合、透明度はちょうどうまくいくはずです。 しかし、2つのPictureBoxオブジェクトを重ねて配置する場合、これは機能しません。透過領域は親オブジェクトの色を取ります。 2つのPictureBoxオブジェクトを持っている場合、両方ともその親としてFormを持ちます。これがあなたの状況であれば、透明イメージのParentプロパティを背景イメージに設定することで解決できます。

private void Form1_Load(object sender, EventArgs e) 
    { 
     transparentPictureBox.Parent = backgroundPictureBox; 
    } 

Parentプロパティを変更する場合は、tranparentPictureBoxLocationは、新しい親からの相対になります。透明な画像から背景画像のx座標とy座標を減算する必要があります。スクリーンショットの例については、私の答え、A PictureBox Questionを参照してください。

AFAIKでは、デザイナーでParentをコードでのみ設定することはできません。したがって、デザイナーはまだではなく、で透明イメージを表示しますが、実行時にはそれが必要です。

PictureBoxオブジェクトの上に透明なLabelを配置する場合、同じ問題が発生します。

1

実際にコードで描画する必要があります。フォームにpictureBoxを配置し、sizeModeを設定して、好きなようにドッキングします。そして、あなたはのPictureBoxのPaintイベントに次の関数を発射することがあります。

class cls_convertImagesByte 
{ 

    public static Image GetImageFromByte(byte[] byteArrayIn) 
    { 
     MemoryStream ms = new MemoryStream(byteArrayIn); 
     Image returnImage = Image.FromStream(ms); 
     return returnImage; 
    } 

    public static byte[] GetByteArrayFromImage(System.Drawing.Image imageIn) 
    { 
     MemoryStream ms = new MemoryStream(); 
     imageIn.Save(ms, System.Drawing.Imaging.ImageFormat.Gif); 
     return ms.ToArray(); 
    } 
} 

ありがとう:

public void LogoDrawTransparent(PaintEventArgs e) 
    { 
     // Create a Bitmap object from an image file. 
     Image myImg; 
     Bitmap myBitmap; 
 try 
     { 
      myImg = cls_convertImagesByte.GetImageFromByte(newImg); 
      myBitmap = new Bitmap(myImg); // @"C:\Temp\imgSwacaa.jpg"); 

      // Get the color of a background pixel. 
      Color backColor = myBitmap.GetPixel(0, 0); // GetPixel(1, 1); 
      Color backColorGray = Color.Gray; 
      Color backColorGrayLight = Color.LightGray; 
      Color backColorWhiteSmoke = Color.WhiteSmoke; 
      Color backColorWhite = Color.White; 
      Color backColorWheat = Color.Wheat; 

      // Make backColor transparent for myBitmap. 
      myBitmap.MakeTransparent(backColor); 
        // OPTIONALLY, you may make any other "suspicious" back color transparent (usually gray, light gray or whitesmoke) 
      myBitmap.MakeTransparent(backColorGray); 
      myBitmap.MakeTransparent(backColorGrayLight); 
      myBitmap.MakeTransparent(backColorWhiteSmoke); 

      // Draw myBitmap to the screen. 
      e.Graphics.DrawImage(myBitmap, 0, 0, pictureBox1.Width, pictureBox1.Height); //myBitmap.Width, myBitmap.Height); 
     } 
     catch 
     { 
      try { pictureBox1.Image = cls_convertImagesByte.GetImageFromByte(newImg); } 
      catch { } //must do something 
     } 
    } 

これは、上記の関数で参照されている私のクラスです。チャグバート。

関連する問題