Ich mache eine Bildskalierung mit GDI + (C #) und habe ein Problem festgestellt, bei dem das Bild, das ich skaliere, entlang der linken und oberen Kante abgeschnitten wird.
Um dies zu reproduzieren, erstellen Sie ein neues Formularprojekt, speichern Sie dieses Bild im Ordner bin \ debug und fügen Sie den folgenden Code hinzu an das Formular (und die entsprechenden Ereignisse):
%Vor%Wie Sie sehen können, werden die linken und obersten Reihen von Pixeln abgeschnitten, als ob das Skalierungsrechteck in der Mitte des Pixels beginnt.
Edit: Zur Beachtung: Ich habe auch versucht, eine Scale-Transformation zu verwenden, anstatt Rechtecke wie oben zu verwenden, und es wurde genau so dargestellt.
Nun, das sagte ich, habe eine Arbeit entdeckt. Wenn Sie die Rechteckdeklarationen im obigen Beispiel wie folgt ändern:
%Vor%Damit wir die "halbe" Sache korrigieren, wird das Bild korrekt gerendert.
Grundsätzlich, während dies leicht zu umgehen ist, mache ich etwas falsch oder ist das normales Verhalten?
Bearbeiten: Gemäß Andrei Panas Vorschlag habe ich versucht, diesen Code vor dem Zeichnungsaufruf hinzuzufügen:
%Vor%Und leider hat es das Rendering nicht beeinflusst. Die Kante war noch abgeschnitten.
Versuchen Sie, PixelOffsetMode auf PixelOffsetMode.Half zu setzen. Standardmäßig werden Pixel für High-Speed-Anti-Aliasing um -0,5
versetztStellen Sie die Größe des Bildes so ein, dass es (in jeder Dimension) 2 Pixel größer ist als die Grafik, die es enthält. Ich bin auch darauf gestoßen und habe festgestellt, dass der Antialiasing-Over-Shoot nie mehr als 1 Pixel pro Seite beträgt.
Mit anderen Worten, entweder deaktivieren Sie das Anti-Aliasing (das wird das beheben) oder ändern Sie diesen Abschnitt Ihres Codes:
%Vor%dazu:
%Vor%(oder verwenden Sie einen äquivalenten Workaround, der srcRect verwendet)
Ja, das ist normales Verhalten und ist ein bekanntes Problem mit GDI + /. Net.
Tags und Links c# gdi+ image-manipulation