C# Qualitätsverlust bei Image aus Datenbank.

IKäsebrot

Ensign
Registriert
Juni 2014
Beiträge
245
Hallo zusammen,

es hört sich so an als würde ich davon ausgehen, dass die Datenbank für einen Qualitätsverlust verantwortlich ist. Das ist nicht die ganze Wahrheit. Der Verlust könnte überall unterwegs passiert sein. Vielleicht habe ich aber auch irgendeine Einstellung vergessen.

Folgendes Szenario:

Ich habe eine WinForm-Anwendung die ist über LINQ to SQL mit einer Datenbank verbunden. In eine der Tabelle können Bilder geladen werden. Die Tabelle sieht wie folgt aus:

Code:
CREATE TABLE [dbo].[Bilder] (
    [Id]       INT   IDENTITY (1, 1) NOT NULL,
    [Bild]     IMAGE NOT NULL,
    PRIMARY KEY CLUSTERED ([Id] ASC)
);

Wenn ich die Bilder in die Datenbank schreiben will muss ich sie erst in ein byte array umwandeln, so:

Code:
        public static byte[] ImageToByteArray(System.Drawing.Image imageIn)
        {
            using (MemoryStream ms = new MemoryStream())
            {
                imageIn.Save(ms, System.Drawing.Imaging.ImageFormat.Gif);
                return ms.ToArray();
            }
        }

Der output dieser Methode wird dann auch in die Datenbank geschrieben. Wenn ich das Bild wieder auslesen will muss das binary array wieder zu einem Image umgewandelt werden:

Code:
        public static Image ByteArrayToImage(byte[] byteArrayIn)
        {
            using (MemoryStream ms = new MemoryStream(byteArrayIn))
            {
                Image returnImage = Image.FromStream(ms);
                return returnImage;
            }
        }

Das funktioniert auch alles super nur hier ist mein Problem. Angenommen ich lade folgendes Bild in die Datenbank:

Käsebrot.png

Jetzt möchte ich das Bild in einer PictureBox anzeigen. Das sieht dann plötzlich so aus:

fail.png

Für den SizeMode-Parameter der PictureBox habe ich schon sämtliche Werte ausprobiert (Normal, Stretchimage, AutoSize,CenterImage,Zoom), nichts hilft.

Kann da jemand helfen? Liegt das vielleicht am Bild selbst?

Gruß und danke im Voraus.
 
Hast du es schon mal mit einem anderen Format versucht (anstatt "System.Drawing.Imaging.ImageFormat.Gif")? Das GIF-Format ist für qualitätsverlust berüchtigt ;).
 
iks-deh schrieb:
Hast du es schon mal mit einem anderen Format versucht (anstatt "System.Drawing.Imaging.ImageFormat.Gif")? Das GIF-Format ist für qualitätsverlust berüchtigt ;).

Jup, habe ich. Die Bilder die ich lade sind in der Regel sowieso PNG-Dateien. Deswegen habe ich die Zeile:


Code:
imageIn.Save(ms, System.Drawing.Imaging.ImageFormat.Gif);

geändert zu

Code:
imageIn.Save(ms, System.Drawing.Imaging.ImageFormat.Png);

leider ohne Erfolg :(
 
Ist das nur bei diesem Image oder auch bei anderen?

Ich würde ja behaupten, dass Image.Save die Datei umwandelt und da der Fehler ist. Ich kann es nicht mit Sicherheit sagen, aber da würde ich erstmal ansetzen.

Wie sieht es denn aus, wenn du das Bild in den Stream liest und direkt wieder aus dem Stream umwandelst?
 
Hast du denn mal geschaut ob das Bild korrekt geladen wird? Also ob es schon so aussieht bevor du es in die Datenbank schreibst.
 
iks-deh schrieb:
Hast du denn mal geschaut ob das Bild korrekt geladen wird? Also ob es schon so aussieht bevor du es in die Datenbank schreibst.

Also ich habe gerade das gleiche Bild in die PictureBox geladen (über OpenFileDialog) und es sieht alles super aus. Aber das bild habe ich als Bitmap erstellt.


Code:
pictureBox.Image = new Bitmap(openFileDialog1.FileName);
 
Du solltest schon die gleiche Implementation nutzen, wie beim Speichern in die DB. Diese Erkenntnis nützt dir sonst gar nix^^
 
trialgod schrieb:
Du solltest schon die gleiche Implementation nutzen, wie beim Speichern in die DB. Diese Erkenntnis nützt dir sonst gar nix^^

Du hast recht ich habe jetzt folgendes probiert.

Habe das Bild über einen OpenFileDialog geladen zu einem Image geladen. Dann benutze ich die erste Methode um ein byte array zu erstellen (ohne etwas in die Db zu laden). In der selben Zeile wandle ich aus dem byte array wieder zu Image und lasse mir das in der PictureBox anzeigen.

Code:
pictureBox.Image = Helper.ByteArrayToImage(Helper.ImageToByteArray(Image.FromFile(openFileDialog1.FileName)));

Das Bild sieht gut aus, keinerlei Qualitätsverluste. Ob das jetzt wohl bedeutet, dass in der Datenbank irgendwas schief läuft?
 
Soweit ich weiß ist IMAGE das gleiche wie VARBINARY. Da hier einfach nur die 1en und 0en gespeichert werden, sollte da eigentlich nichts passieren. Ansonsten versuch doch einfach mal die Tabellenspalte in VARBINARY zu ändern. Vielleicht geht es ja dann.
 
Kannst du das Projekt mal irgendwo hochladen? Dann kann man sich das vielleicht besser anschauen.
 
Mir ist inzwischen etwas aufgefallen. Wenn ich die Bilder aus der Datenbank lese und per Breakpoint reingucke hat das Bild jeweils eine Breite und Höhe von 16 bei ImageSize. Dafuq :lol:
 
So hier die Lösung:

Das Problem lag bei "ImageList". Diese kann zwar Bilder speichern aber nicht mit variierender Bildgröße. Deswegen wurden sämtlicher Bilder zu einer einheitlichen Größe von 16x16 verkleinert.

Behoben werden konnte das Problem indem man eine List<Image> genommen hat anstatt ImageList.

Gruß,
euer Käsebrot!
 

Ähnliche Themen

Zurück
Oben