Woher kommt dieser Qualitätsverlust bei Bildern?

8

in meiner Winforms-Anwendung, die mit einer Datenbank über Linq mit SQL verbunden ist Ich speichere Bilder (immer * .png) in eine Tabelle, die wie folgt aussieht:

%Vor%

Bevor ich ein Bild speichern kann, muss ich es in byte[] umwandeln und so mache ich es:

%Vor%

Wenn ich dieses Bild später in eine PictureBox in meiner Anwendung laden möchte, konvertiere ich es mit dieser Methode zurück:

%Vor%

Es funktioniert tatsächlich, das einzige Problem erscheint, wenn ich versuche, ein Bild aus der Datenbank in einer Picturebox anzuzeigen.

Also wenn ich dieses Bild in die Datenbank lade:

und später versuche ich es anzuzeigen. Es sieht plötzlich so aus:

Ich habe bereits alle möglichen SizeMode Einstellungen für die PictureBox ausprobiert (Normal, Stretchimage, AutoSize, CenterImage, Zoom) und es sieht immer noch so aus.

Auch hier lade ich die Bilder aus der Datenbank auf die imageBox:

Zuerst lade ich alle Bilder, die zu einem Set gehören, über die ID:

ab %Vor%

Auch in meiner Anwendung habe ich eine Datagridview, wo Ids in der ersten Spalte gespeichert sind. Wenn ich also Bilder aus dem Set abrufen möchte, mache ich das so:

%Vor%

Nach dem Laden aus einem lokalen Verzeichnis sieht das Image in der PictureBox gut aus. Ich habe auch versucht, das ursprüngliche Bild in Binär-und zurück zu konvertieren (ohne es in die Datenbank zu laden), es sah immer noch gut aus, wenn in der PictureBox angezeigt.

Beim Debuggen des Images, das aus der Datenbank kam, habe ich noch etwas anderes bemerkt. Beim Betrachten der Bildgröße hatten Breite und Höhe beide den Wert 16. Das ist seltsam, weil das Originalbild völlig andere Dimensionen hat.

Irgendwelche Ideen?

    
チーズパン 28.10.2014, 15:22
quelle

3 Antworten

7

Es scheint, dass ImageList Ihre Bilder in MemoryBmp konvertiert, wenn Sie sie in GetRezeptImages zur Liste hinzufügen.
Ich bin mir nicht bewusst, warum es das tun würde, aber das ist der Grund für Ihren Qualitätsverlust im Bild. Wie Sie auch festgestellt haben, wird das Bild in ein 16x16-Bild konvertiert und wenn es dann in Ihrer PictureBox auf die Originalgröße verkleinert wird, sieht es nur noch kitschiger aus.

Bearbeiten:
Aus dem Kommentar von TaW: Die ImageList-Sammlung kann keine Bilder unterschiedlicher Größe verarbeiten. Daher konvertiert sie alle Bilder in eine gemeinsame Größe. Da keine Größe festgelegt ist, scheint es standardmäßig 16x16 zu sein.

Ich würde empfehlen, dass Sie die GetRezeptImages -Methode ändern, um eine List<Image> anstelle von ImageList zurückzugeben und diese entsprechend zu verwenden, um die Bilder anzuzeigen.

Alternativ können Sie, wenn Sie immer die GetRezeptImages -Methode auf die gleiche Weise wie in Ihrer Frage verwenden, diese ändern, um immer nur das erste Bild in einem Image -Objekt zurückzugeben und alle Listen vollständig wegzuwerfen .

    
Bernd Linde 28.10.2014, 17:26
quelle
4

ImageList ist gut für das, was kann : Speichern Sie viele Bilder, ohne GDI-Ressourcen zu verlieren.

Aber was nicht kann ist, was Sie wahrscheinlich brauchen: Speichern Sie Bilder von verschiedenen Größen & amp; Anteile .

Sie können und sollten sie Imagesize und ColorDepth properties setzen (schauen Sie sich die Standardeinstellungen an, die eindeutig für die Verwendung als StateImageList gedacht sind; 16x16px und 8bit Tiefe sind sogar schlecht für eine LargeImageList ..) aber Sie können ' t verwenden Sie es, wenn Ihre Bilder verschiedene Größen haben müssen & amp; Proportionen ..

Wenn sie das nicht tun, das heißt, wenn sie zumindest ihre Proportionen teilen können, fixiere einfach ImageList , indem du eine schöne Größe wählst und fertig! Alle Bilder, die Sie der ImageList hinzufügen, werden automatisch auf diese Size skaliert und in die ColorDepth konvertiert.

Ansonsten ersetzen Sie es durch List<Image> oder List<Bitmap> ..!

Wenn Sie die übliche Größe und ColorDepth Ihrer Bilder kennen, können Sie das tun:

%Vor%

Sie können entweder nicht ImageList , sondern stattdessen ein List<Image> oder List<Bitmap> oder make verwenden  sie - das heißt: Schneiden Sie sie auf die gleiche Proportion , grundsätzlich nicht viel mehr als ein paar zusätzliche Zeilen ..:

%Vor%

Diese Routine erweitert die Größe des Bildbereichs mit transparenten Pixeln nach rechts oder unten, ohne die Pixel zu skalieren, damit sie verlustfrei scharf bleiben.

    
TaW 28.10.2014 17:29
quelle
0

Auch Sie könnten darüber nachdenken, es in eine string64 anstelle von byte [] zu konvertieren. Der Code ist ein wenig sauberer und sobald es eine Zeichenfolge ist, kann es in fast jeder Datei abgelegt werden, weil es nur Text ist.

    
Kaz Duston McGown 17.08.2015 03:23
quelle

Tags und Links