2009-07-30 12 views
0

Ich habe eine Methode zum Zuschneiden von Bildern in C# geschrieben. Dazu erstellt er ein neues Bitmap und zeichnet daraus ein spezifiziertes Rechteck (den zu beschneidenden Bereich) aus dem Originalbild.Warum muss ich eine Auflösung für das Zuschneiden angeben?

Für die Bilder, mit denen ich versucht habe, erzeugte falsche Ergebnisse. Die Größe des resultierenden Bildes war richtig, aber der Inhalt war es. Es war, als ob das Bild um 2 vergrößert und dann beschnitten wurde. Schließlich fügte diese Zeile hinzu:

result.setResolution(72, 72) 

Aber warum brauche ich eine Lösung? Ich arbeite nur mit Pixeln, niemals mit Zoll oder Zentimetern. Was wäre dann die richtige Auflösung?

Der vollständige Code ist diese Erweiterung Methode:

public static Bitmap Crop(this Image image, int x, int y, int width, int height) { 
    Bitmap result = new Bitmap(width, height); 
    result.SetResolution(72, 72); 

    // Use a graphics object to draw the resized image into the bitmap. 
    using (Graphics graphics = Graphics.FromImage(result)) { 
     // High quality. 
     graphics.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality; 
     graphics.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic; 
     graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality; 
     // Draw the image into the target bitmap. 
     graphics.DrawImage(image, 0, 0, new Rectangle(x, y, width, height), GraphicsUnit.Pixel); 
    } 

    return result; 
} 

Antwort

1

Sie verwenden die falsche Überladung von DrawImage. Sie sollten die verwenden, in der Sie die Src- und Dest-Verweise angeben.

graphics.DrawImage(image, new Rectangle(0, 0, width, height), new Rectangle(x, y, width, height), GraphicsUnit.Pixel); 

Versuchen Sie das und lassen Sie mich in Kommentaren wissen, wenn es nicht funktioniert.

-1

ich die Antwort vermuten, in der Art und Weise liegt tatsächlich die Bibliothek die Modifikation macht. es kopiert und fügt nur einige Speicherblöcke ein. Die Auflösung gibt die Anzahl der pro Pixel verwendeten Bits/Bytes an. Um zu wissen, wie viele Bytes er kopieren muss, muss er wissen, wie viele Bits/Bytes pro Pixel verwendet werden.

daher denke ich, das ist eine einfache Multiplikation gefolgt von einer Memcopy.

grüße

+0

Sollte das Format des Bildes nicht definieren, wie viele Bytes pro Pixel? Ist es RGB? RGBA? Sind sie Ints, Longs oder Floats? Und dann kopiere einfach die Pixel, denen ich es erzähle. – Pablo

+0

gut ja, tut es. Das Format enthält jedoch nur Informationen darüber, wie die Daten gespeichert werden. Je nach Format ist es möglich, dass die Auflösung variabel ist und daher vom Format nicht genau bekannt ist. Ich denke, Floats gelten nicht. Welche Art von Format ist das? oder ist es unbekannt? Was passiert, wenn Sie die Zeile result.SetResolution (72, 72) weglassen; Grüße – Atmocreations

+0

Ich denke, Grafikkarten verwenden RGBA mit Schwimmern. Wenn ich die Auflösung weglasse und sagen wir, ich schneide (0, 0, 100, 100) bekomme ich ein Bild von 100 mal 100 mit einem Stück des Originalbildes von etwa 60 mal 60 ausgestreckt. – Pablo

Verwandte Themen