Heim  >  Artikel  >  Backend-Entwicklung  >  C# GDI+ Programmierung (4)

C# GDI+ Programmierung (4)

高洛峰
高洛峰Original
2016-12-17 10:11:531258Durchsuche

Screenshot
Die CopyFromScreen-Funktion in der Grahpics-Klasse kann den Bildschirm in das Graphics-Objekt kopieren. Wenn das Grafikobjekt aus dem Fensterformular erstellt wird, wird der Bildschirm direkt
im Fenster angezeigt. Schauen Sie sich das Beispiel an: Fügen Sie dem Fenster eine Schaltfläche und dann einen Click-Event-Handler zur Schaltfläche hinzu.
Der Code in der Funktion lautet wie folgt:
private void button1_Click(object sender, EventArgs e)
{
this.CreateGraphics().CopyFromScreen(50,50, 0, 0, this. Size,CopyPixelOperation .SourceCopy);
}
Der erste Parameter und der zweite Parameter geben an, wo mit dem Kopieren auf dem Bildschirm begonnen werden soll, und die folgende 0,0 bedeutet, dass der Bildschirm in das Fenster kopiert wird, beginnend an der Stelle im Fenster zeigen.
this.Size ist die Größe (Breite und Höhe), die kopiert werden soll.

ist in VC++. Das ist nur eine andere Art, es auszudrücken. Das Endergebnis ist immer noch das gleiche.

Die vorherige Erstellung von Grafikobjekten erfolgte ausschließlich über das Fenster. Dieses Mal erstellen wir das Grafikobjekt über Bilder, damit wir auf den Bildern zeichnen können.
Das Erstellen von Bildobjekten ist nicht die einzige Möglichkeit, Dateien zu laden. Wir können eine „leere“ Bitmap erstellen (über den Konstruktor). Diese Bitmap enthält keine spezifischen Daten, oder die darin enthaltenen Standarddaten sind nutzlos. Zeichnen Sie hinein und fügen Sie Daten hinzu.


Beispiel: Machen Sie einen Screenshot und speichern Sie das Bild als Datei
private void button1_Click(object sender, EventArgs e)
{
//Erstellen Sie ein Bitmap-Bild mit einer Breite von 800 , 600 Höhe, so ein großer Container.
Bitmap bmp = new Bitmap(800, 600);
//Erstelle ein Grahpics-Objekt aus dem Bild
Graphics gr = Graphics.FromImage(bmp);
//Kopiere den Bildschirm in Bitmap
gr.CopyFromScreen(0, 0, 0, 0, new Size(800, 600), CopyPixelOperation.SourceCopy);
//Als Bilddatei speichern
bmp.Save("d:\screen.jpg ") ;
}
Wie wäre es damit? Es ist ganz einfach. Es sind vier Codezeilen erforderlich, um einen Screenshot zu erstellen und ihn als Datei zu speichern. VC++ erfordert viele Codezeilen. Darüber hinaus wird Bitmap von der Image-Klasse abgeleitet.

Einmaliges Zeichnen mit doppelter Pufferung
Schauen wir uns ein Beispiel ohne Verwendung der doppelten Pufferung an. Wenn sich die Maus innerhalb des Fensters bewegt, zeigt das Rechteck in der oberen linken Ecke die aktuelle Position der Maus an
Öffentliche Teilklasse Form1: Form
{
public Form1()
{
InitializeComponent();
this.MouseMove += formMouseMove;
}
private void formMouseMove(object sender, MouseEventArgs e)
Who ’Who 'Who' Who 'rechteckig, lineargradientbrush pinsel =
neu lineargradientBrush (rechte, farbe, aus der Freomargb (44, 55, 66), color.fromargb (123, 150, 189),
LinearGradientMode.Horizontal);
gr.FillRectangle(brush, rect);
                   // Ein Rechteck zeichnen
Pen pen = new Pen(Color.Green, 2);
gr.DrawRectangle( pen, rect);
//Text anzeigen
gr.TextRenderingH int = System.Drawing.Text.AntiAlias;
String str = String.Format("Mausposition:n{0},{ 1}", e.X, e.Y);
gr.DrawString(str, new Font("黑体", 11 ),Brushes.White, rect);
}
}
Wie Sie sehen können , wenn die Maus bewegt wird, blinkt das Rechteck in der oberen linken Ecke offensichtlich. Dies liegt daran, dass dreimal gezeichnet, das Rechteck gefüllt und dann Text angezeigt wird. Das hat es verursacht.
Je öfter Sie zeichnen, desto deutlicher wird dieses Flackern.
Und diese drei Zeichnungen müssen am Ende nur ein Ergebnis erhalten, nämlich ein Bild. Dann können wir die doppelte Pufferung verwenden, um es zu vervollständigen. Zeichnen Sie zuerst die zu zeichnenden Grafiken in die Bitmap. Zeichnen Sie dann einfach die Bitmap in das Fenster.
Sehen Sie sich das Beispiel an:
private void formMouseMove(object sender, MouseEventArgs e)
{
Graphics Graphics = this.CreateGraphics();
//From Create Graphics object in Bitmap
           Bitmap bmp = new Bitmap (100,35); ), Color.FromArgb(123, 150, 189),
LinearGradientMode.Horizontal);
gr.FillRectangle(brush , rect);
//Zeichne ein Rechteck
Stift pen = new Pen(Color.Green, 2);
gr.DrawRectangle(pen, rect);
//Text anzeigen
gr.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiA lias;
String str = String.Format("Mausposition:n{0},{1}", e.X, e.Y);
gr.DrawString(str, new Font("黑体", 11),Brushes. White , RECT);

// Draw

Graphics.DrawImage (BMP, 0, 0);

Holen Sie sich die Bitmap

Drawtobitmap Funktion, die zeichnen kann Darstellung eines Fensters oder Steuerelements in einer Bitmap. Es gehört zur Control-Klasse, und sowohl die Fensterklasse als auch die Control-Klasse sind von der Control-Klasse abgeleitet.

Sehen Sie sich das Beispiel an: (Code einer Button-Click-Event-Handler-Funktion)
private void button1_Click(object sender, EventArgs e)
{
Bitmap bmp = new Bitmap(Width, Height);
this.DrawToBitmap(bmp, neues Rechteck(0, 0, Breite, Höhe));
bmp.Save("d:\form.jpg");
}
Der zweite Parameter von DrawToBitmap , ist der Bereich des Fensters, der in der Bitmap angezeigt wird. Dieses Bild kann nicht verkleinert oder vergrößert werden. Die Größe des Fensters entspricht der Größe der Bitmap.
Wenn Sie 10, 10, 50, 50 eingeben, werden 0, 0, 50, 50 angezeigt In 10 der Bitmap angezeigt, kann die Startposition des Fensters nicht angegeben werden. Es kann nur bei Position 0, 0 beginnen.

Den Wert eines Pixels abrufen

Die GetPixel-Funktion in der Bitmap-Klasse kann den Farbwert eines Pixels abrufen. Wenn Sie den Farbwert eines Pixels im Fenster abrufen möchten, können Sie zuerst aufrufen die DrawToBitmap-Funktion und geben Sie

Das Fenster wird als Bitmap gespeichert. Dann hol es dir nochmal. Noch etwas: Es gibt auch eine entsprechende Funktion SetPixel, um den Farbwert eines Pixels festzulegen.

Holen Sie sich den Anzeigebereich für PNG-Bilder und erstellen Sie ein unregelmäßiges Fenster.

Um den PNG-Bildbereich abzurufen, können Sie die Funktion GetPixel verwenden, um den Farbwert jedes Pixels im Bild abzurufen. Wenn der Alpha-Wert 0 ist, ist es transparent, andernfalls fügen Sie diesen Punkt zum Bereich hinzu. Wie erhält man also den Alpha-Wert eines Color-Objekts? Rufen Sie die ToArgb-Mitgliedsfunktion auf. Dies ist eine 32-Bit-Ganzzahl, die nur vier 8-Bit-Werte speichern kann: A, R, G, B.

Sehen Sie sich das Beispiel an und extrahieren Sie den Alpha-Wert
{
Color cor1 = Color.FromArgb(123,225,229,230);
//Erhalten Sie den Argb-Wert von Color
int argb = cor2.ToArgb( );
//In Zeichenarray konvertieren
byte[] bargb = BitConverter.GetBytes(argb);
//bargb[3] speichert den Alpha-Wert
String str = String.Format( " {0},{1},{2},{3}", bargb[0], bargb[1], bargb[2], bargb[3]);
MessageBox.Show(str);
}
Ein vollständiges Beispiel, erhalten Sie den PNG-Anzeigebereich

Beispielcode:

public Form1()
{
InitializeComponent();
                 //PNG-Bilder laden Bitmap BMP = Neue Bitmap ("D: \ Image \ Win.png"); // Bestimmen Sie den Farbwert jedes Pixels und erhalten Sie den Anzeigebereich des Bildes
for (int y = 0; y & lt ; bmp.Height; y++)
for (int x = 0; x < bmp.Width;                                                                                    . if (bargb[3] != 0)
                                                           
                             Pixelbereich zum Pfad                                                                                             { Etwas unzuverlässig, wenn der Farbwert einiger Pixel im PNG-Bild halbtransparent ist, sodass Sie nicht das gewünschte Erscheinungsbild erhalten. Obwohl einige Teile des PNG-Bildes transparent zu sein scheinen.
Die Lösung besteht darin, PNG-Bilder selbst zu erstellen und Ihren eigenen Regeln zu folgen. Suchen Sie nicht online danach.

Nachdem Sie ein unregelmäßiges Fenster eingerichtet haben, können Sie das PNG-Bild in das Fenster zeichnen. Aufgrund des Transparenzproblems müssen Sie das Fenster jedoch zuerst mit einem transparenten Pinsel füllen und dann zeichnen.

Aber es gibt noch ein weiteres Problem: Die Zeichnung von Fenstern, die nicht zum Clientbereich gehören, wird wie unsere vorherige Zeichnung vollständig im Fenster-Clientbereich gezeichnet.

Wenn das zu zeichnende Bild dem Fenster entspricht, muss es aus dem Nicht-Client-Bereich gezeichnet werden. Wie geht das? Lassen Sie uns im nächsten Kapitel darüber sprechen.




Weitere Artikel zum Thema C# GDI+-Programmierung (4) finden Sie auf der chinesischen PHP-Website!



Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Vorheriger Artikel:C# GDI+ Programmierung (5)Nächster Artikel:C# GDI+ Programmierung (5)