C# GDI+ プログラミング (4)

高洛峰
高洛峰オリジナル
2016-12-17 10:11:531329ブラウズ

スクリーンショット
Grahpics クラスの CopyFromScreen 関数は、画面を Graphics オブジェクトにコピーできます。 Graphics オブジェクトがウィンドウ Form から作成された場合、画面はウィンドウ内に直接表示されます。例を見てください。ウィンドウにボタンを追加し、そのボタンにクリック イベント ハンドラーを追加します。
関数のコードは次のとおりです:
private void button1_Click(object sender, EventArgs e)
{
this.CreateGraphics().CopyFromScreen(50,50, 0, 0, this.Size,CopyPixelOperation.SourceCopy);
}
1 番目のパラメータと 2 番目のパラメータは画面上のどこからコピーを開始するかを示し、次の 0,0 は画面をウィンドウにコピーし、ウィンドウ内のどこから表示を開始するかを意味します。
this.Size はコピーされるサイズ (幅と高さ) です。

VC++ です。これは言い方が違うだけです。最終結果は依然として同じです。

以前のグラフィック オブジェクトはウィンドウを通じて作成されました。今回は、画像上に描画できるように、画像を通じてグラフィック オブジェクトを作成します。

画像オブジェクトの作成がファイルをロードする唯一の方法ではありません。 (コンストラクターを介して) 「空の」ビットマップを作成できます。このビットマップには特定のデータがないか、そのようなコンテナーが必要なだけです。内部に描画してデータを追加します。

例: スクリーンショットを撮り、画像をファイルとして保存します
private void button1_Click(object sender, EventArgs e)
{
//幅 800、高さ 600、このサイズのコンテナーのビットマップ画像を作成します。
Bitmap bmp = new Bitmap(800, 600);
//画像からGraphicsオブジェクトを作成
Graphics gr = Graphics.FromImage(bmp);
//画面をBitmapにコピー
gr.CopyFromScreen(0, 0, 0, 0, new Size(800, 600), CopyPixelOperation.SourceCopy);
//画像ファイルとして保存
bmp.Save("d:\screen.jpg");
}
どうでしょうか、とても簡単です、 4 行 このコードでスクリーンショットが完成し、それをファイルとして保存するには、多くの行のコードが必要です。さらに、Bitmap は Image クラスから派生します。

ダブルバッファリングのワンタイム描画
ダブルバッファリングなしの例を見てみましょう。マウスがウィンドウ内で移動すると、左上隅の四角形にマウスの現在位置が表示されます
public 部分クラス Form1: Form
{
public Form1() I {
initializecomponent();
This.mousemove+= formmousemove;
RECTANGLE RECT = New Rectangle (0, 0 , 100, 35); Brush =
New Lineargradientbrush (Rect, color.fromargb (44, 55, 66), color.fromargb (123, 150, 189) Adientmode.horizo​​ntal);
gr.TextRエンダリングヒント= System.Drawing.Text.TextRenderingHint.AntiAlias;
String str = String.Format("Mouse Position:n{0},{1}", e. ),Brushes.White, rect);
}
あなたマウスを動かすと、左上隅の四角形が明らかに点滅することがわかります。これは、四角形の塗りつぶし、四角形の描画、テキストの表示の 3 回の描画が行われているためです。それが原因でした。
描画回数が増えるほど、このちらつきがより顕著になります。
そして、これら 3 つの描画は、最終的に 1 つの結果、つまり画像を取得するだけで済みます。その後、ダブル バッファリングを使用して、最初にビットマップに描画するグラフィックを描画します。次に、ビットマップをウィンドウに描画するだけです。
例を見てください:
private void formMouseMove(object sender, MouseEventArgs e)
{
graphics = this.CreateGraphics();
//ビットマップからグラフィック オブジェクトを作成します
Bitmap bmp=new Bitmap(100,35);
Graphics gr = Graphics.FromImage(bmp); new LinearGradientBrush(rect, Color.FromArgb(44, 55, 66) , Color.FromArgb(123, 150, 189),
LinearGradientMode.色。ペンpen = new Pen(Color.Green, 2);
gr.DrawRectangle(pen, rect);
//テキストを表示
gr.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAlias; , , , , - , , , , , after- - til pu pu pu pu octo pu pu pu pu pt q q q q q q q q q q ("マウス位置: n{0},{1}", e. Draw
graphics.DrawImage(bmp, 0, 0);
}

ウィンドウ (コントロール) のビットマップを取得します。
DrawToBitmap 関数を使用すると、ウィンドウまたはコントロールの外観をビットマップに描画できます。これは Control クラスに属しており、ウィンドウ クラスとコントロール クラスは両方とも Control クラスから派生します。
例を見てください: (ボタンクリックイベントハンドラー関数のコード)

private void button1_Click(object sender, EventArgs e)

{
Bitmap bmp = new Bitmap(Width, Height);
this.DrawToBitmap(bmp, new Rectangle ( 0, 0, width, height));
bmp.Save("d:\form.jpg");
}
DrawToBitmap の 2 番目のパラメーターは、ビットマップ内でウィンドウが表示される領域です。画像を縮小したり拡大したりすることはできません。 ウィンドウのサイズはビットマップのサイズと同じです。 10、10、50、50 を入力すると、ウィンドウの 0、0、50、50 が表示されます。ビットマップの 10, 10 の 50,50 の長方形領域内で、ウィンドウの開始位置は位置 0,0 からのみ指定できますか?

ピクセルの値を取得する
Bitmap クラスの GetPixel 関数は、ピクセルの Color 値を取得することができます。ウィンドウ内の特定のピクセルのカラー値を取得したい場合は、まず DrawToBitmap 関数を呼び出して保存します。
ウィンドウをビットマップとして表示します。それからもう一度入手してください。もう 1 つ: ピクセルのカラー値を設定するための対応する関数 SetPixel もあります。

PNG画像の表示領域を取得し、不規則なウィンドウを作成します。

PNG 画像領域を取得するには、GetPixel 関数を使用して画像内の各ピクセルのカラー値を取得します。アルファ値が 0 の場合は透明で、それ以外の場合はこのポイントを領域に追加します。では、Color オブジェクトの Alpha 値を取得するには、ToArgb メンバー関数を呼び出します。これは、A、R、G、B の 4 つの 8 ビット値を格納できる 32 ビット整数です。
例を見て、アルファ値を抽出します
{

Color cor1 = Color.FromArgb(123,225,229,230);

//Color の argb 値を取得します
int argb = cor2.ToArgb();
//文字配列に変換します
byte[] bargb = BitConverter.GetBytes(argb);
//bargb[3] はアルファ値を格納します
String str = String.Format("{0},{1},{2},{3}", bargb[0], bargb[1], bargb[2], bargb[3]);
MessageBox.Show(str);
}
PNG 表示領域を取得する完全な例

サンプル コード:
//PNG 画像の読み込み

Bitmap bmp = new Bitmap("d:\Image\ win.png"); bmp.Width; x++)
{
Color cor = bmp.GetPixel(x, y) ;
int argb = cor.ToArgb();
byte[] bargb = BitConverter.GetBytes(argb);
//像素颜色值透明ではありません (if (bargb [3]! = 0) {
// このピクセルを追加しますarea パスへの area
path.addrectangle (new Rectangle (x, y, 1, 1)); 『 アウト' ' ‐ Up's together's' out's'''‐''''''''''''‐''''‑Set Window's これでは、望ましい外観は得られません。 PNG画像の一部が透過しているように見えますが。
解決策は、PNG 画像を自分で作成し、独自のルールに従うことです。ネットで探さないでください。

不規則なウィンドウを設定した後、PNG画像をウィンドウに描画できますが、半透明の問題のため、最初に透明なブラシでウィンドウを塗りつぶしてから描画する必要があります。

しかし、別の問題があります。前の描画と同様に、非クライアント領域のウィンドウ描画はすべてウィンドウのクライアント領域に描画されます。

描画する絵がウィンドウに該当する場合は、非クライアント領域から描画を開始する必要があります。これを行う方法。それについては次の章でお話しましょう。




C# GDI+ プログラミング (4) 関連記事の詳細については、PHP 中国語 Web サイトに注目してください。



声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。