2012-03-08 35 views
6

私はユーザーの画面のポーションのスクリーンショットを取るC#でプログラムに取り組んでいます登場。ほとんどのpertのためにそれはすべきだが、私は最近、一つの問題にぶつかった。出力画像に常に透明に見える(少なくとも)1つのピクセルカラーがあるようです。カラー#0D0B0C(RGB 13,11,12)のインスタンスは、保存されたpngで透明に見えます。これは、PixelFormatがFormat32bppArgbに設定されています。 Format32bppRgbまたはFormat24bppRgbに設定すると、同じピクセルカラーが保存されたpngに黒色で表示されます。C#のBitmapオブジェクト、色などの透明

は、私がこれを引き起こしている可能性がどのような見当がつかないが、私は「解決」するために行うことができました唯一のことは、それがCopyFromScreenを行う前に、グラフィックスは、その色に反対クリアすることです()。私はいくつかの理由でそれをするのは嫌です。最初に、それが問題を抱えている唯一の色であるかどうかはわかりません(16,777,216色にはかなりの可能性があります)。そして、第2に、ハックフィックスが嫌いです。これはハックフィックスのようです。

誰もがこの問題を引き起こしている可能性がありますどのように任意の光を当てることができますか?ビットマップ作成でPixelFormatを使いこなし、CopyFromScreenメソッドのCopyPixelOperationで何も動作しないようです。グラフィックスオブジェクトをその色にクリアすると、それが「修正」されるという事実は、透明度がスクリーンデータ自体から来ていると私には思われますが、それは理にかなっていません。私はこれをあまりにも長く見てきました。私はそれについて新鮮な視点が必要だと思います。どうしてこのことが起こっているのか分かっている人は、それを聞いてみたいです。ありがとうございました。

答えて

-2

あなたの画面に不良ピクセルがあるように見えます。

+2

あなたはそれを診断するためにしなければならないすべては、画面上のフォームを移動し、それが消えるかどうかを確認しています。私は非常に真剣にそれが問題だとは思っていません... –

+0

それは複数のピクセルで、複数の異なるスクリーン/コンピュータ上で起こり、常にその色です。私は問題は修正されたと思ったが、プログラムのユーザーの1人はそれがまだ起こっていると私に言った。 – HaLo2FrEeEk

1

アルファ値はおそらく0ですか?あなたはそれをチェックしましたか?

はFormat32bppArgbとFormat32bppRgbの間には大きな異なるため、2番目の形式はアルファチャンネルを知らないということです。ビットマップへのコントロールをレンダリングするとき

+0

印刷画面では正しい画像が得られ、OPで述べたように、Format32bppRgbに設定すると、同じピクセルが黒く表示されます(#0D0B0Cになるはずです)。他のピクセルは透明ではなく、印刷画面にも同様に表示されます。 – HaLo2FrEeEk

+0

スクリーンショットをどのようにキャプチャしますか? – cansik

+0

私はOPで言ったように、私はグラフィックスオブジェクトとCopyFromScreen()を使用します。 – HaLo2FrEeEk

0

は正確に同じ問題を持っていました。 PixelFormat.Format32bppRgbで別のビットマップを作成し、BitBltでそれを修正することができます。お役に立てれば!

public class ScreenCapture 
{ 
    [System.Runtime.InteropServices.DllImportAttribute("gdi32.dll")] 
    private static extern bool BitBlt(
     IntPtr hdcDest, // handle to destination DC 
     int nXDest, // x-coord of destination upper-left corner 
     int nYDest, // y-coord of destination upper-left corner 
     int nWidth, // width of destination rectangle 
     int nHeight, // height of destination rectangle 
     IntPtr hdcSrc, // handle to source DC 
     int nXSrc, // x-coordinate of source upper-left corner 
     int nYSrc, // y-coordinate of source upper-left corner 
     System.Int32 dwRop // raster operation code 
     ); 


    /// <summary> 
    /// Returns an image of the control 
    /// </summary> 
    /// <param name="control">The control object whose image is wanted</param> 
    /// <returns>Image of the control</returns> 
    /// <remarks>This is based on code from 
    /// http://www.dotnet247.com/247reference/a.aspx?u=http://www.c-sharpcorner.com/Code/2002/April/ScreenCaptureUtility.asp 
    /// with changes made to prevent 0D0B0C transparency issues</remarks> 
    public static Image GetControlImage(Control control) 
    { 
     Graphics g1 = control.CreateGraphics(); 

     // Create a bitmap the same size as the control 
     Image MyImage = new Bitmap(control.ClientRectangle.Width, control.ClientRectangle.Height, PixelFormat.Format32bppRgb); 
     (MyImage as Bitmap).SetResolution(g1.DpiX, g1.DpiY); 

     Graphics g2 = Graphics.FromImage(MyImage); 

     IntPtr dc1 = g1.GetHdc(); 
     IntPtr dc2 = g2.GetHdc(); 

     // BitBlt from one DC to the other 
     BitBlt(dc2, 0, 0, control.ClientRectangle.Width, control.ClientRectangle.Height, dc1, 0, 0, 13369376); 

     // Release Device Contexts 
     g1.ReleaseHdc(dc1); 
     g2.ReleaseHdc(dc2); 

     // This statement runs the garbage collector manually 
     // (If not present, uses up large amounts of memory...) 
     GC.Collect(); 

     return MyImage; 
    } 
} 
0

私は単にのような、全くアルファチャンネルを持っていないビットマップにCopyFromScreenを要求しなければならなかった:私はこれがFormat32bppArgbと透明画素穴がありますがないとのことを確認した

Bitmap bitmap = new Bitmap(bounds.Width, bounds.Height,  System.Drawing.Imaging.PixelFormat.Format32bppRgb); 
Graphics graphics = Graphics.FromImage(bitmap as Image); 
graphics.CopyFromScreen(bounds.Location, new Point(0, 0), bitmap.Size); 

Format32bppRgb

関連する問題