Laden...

Bilder Umwandeln und in DB speichern

Erstellt von hammlet90 vor 11 Jahren Letzter Beitrag vor 11 Jahren 1.158 Views
H
hammlet90 Themenstarter:in
8 Beiträge seit 2013
vor 11 Jahren
Bilder Umwandeln und in DB speichern

Hallo,
Ich habe bis jetzt ein c# Programm geschrieben in dem man Tabellen bearbeiten kann.
Ich habe in meiner DB eine weitere Spalte hinzugefügt, dort können Bilder gespeichert werden.

Wenn man nun über den Dialog eine Datei auswählt nehme ich diesen pfad und möchte
1.Die Datei in das Format .bmp verwandeln
2.Die Datei fals zu groß auf 16*16 skalieren dabei aber das Seitenverhältnis beibehalten.
3.Die Datei in die DB mit abspeichern.

Ich bin jetzt soweit, das ich meine Bilder skalieren kann.
Nur ist das Problem, das ich die Bilder zwar skalieren kann, aber wenn ich das Seitenverhältniss beibehalte (hab ich ich auskommentiert) kommt es vor das das Bild z.B 1613 wird und nicht 1616. Gibt es eine Möglichkeit wenn das Bild 1613 ist die letzten 3, schwarz oder weiß zu färben, das das Bild auf 1616 kommt ?


 Image original = new Bitmap(szDialogInitialDirectory);

                    int width = 16;
                    int height = 16;

                    //double factor = original.Width / (double)original.Height;
                    //if (factor > 1)
                    //    height = (int)(height / factor); // Querformat
                    //else
                    //    width = (int)(width * factor); // Hochformat

                    Image neu = original.GetThumbnailImage(width, height, null, IntPtr.Zero);

                    if (Path.GetExtension(szDialogInitialDirectory).ToString() != ".bmp")
                    {

                        neu.Save(Path.GetDirectoryName(szDialogInitialDirectory) + "\\" + Path.GetFileNameWithoutExtension(szDialogInitialDirectory) + ".bmp", System.Drawing.Imaging.ImageFormat.Bmp);

                        neu.Dispose();

                        original.Dispose();

                        File.Delete(szDialogInitialDirectory);
                    }
                    else 
                    {
                        if (original.Height != 16 || original.Width != 16)
                        {
                            original.Dispose();

                            File.Delete(szDialogInitialDirectory);

                            neu.Save(szDialogInitialDirectory);

                            neu.Dispose();

                        }
                        else { }
                    }

So ich hab mir mal folgenden Lösungsweg überlegt. Nur weiß ich nicht wir ich ihn umsetzen aknn.
Zuerst sollte ich ein Bild erstellen mit den Maßen 16 x 16 welches komplett weiß ist. Dann möchte ich das Weiße Bild mit meinem Bild übermalen, so das mein richtiges Bild zu sehne ist und wenn es kleiner als 16 x 16 ist ist der Rest ja weiß. Nur wie kann ich das machen ?

C
224 Beiträge seit 2009
vor 11 Jahren

Hi hammlet90,

spontan könntest Du die Länge und Höhe prüfen und wenn es nicht 16*16 ist:

  • Ein neues 16x16 Bitmap erzeugen.
  • Daraus mit Graphics.FromImage ein Graphics erzeugen.
  • Beim Graphics Objekt die Clear(Color.White) Methode verwenden.
  • Beim Graphics Objekt mit DrawImage das andere Bild hineinkopieren.
  • Und dann das neue Bild speichern.

Gruß,
CoLo

4.221 Beiträge seit 2005
vor 11 Jahren

Schau Dir mal die Thumbnail-Methode in folgendem Beispiel an:

Listbox für Bilder

Früher war ich unentschlossen, heute bin ich mir da nicht mehr so sicher...

H
hammlet90 Themenstarter:in
8 Beiträge seit 2013
vor 11 Jahren

Hi CoLo,

ich hab meine Code nun so erweitert



                    Image neu = original.GetThumbnailImage(width, height, null, IntPtr.Zero);
                    Bitmap weiß = new Bitmap(16, 16);
                    Graphics g = Graphics.FromImage(weiß);
                    g.Clear(Color.White);
                    g.DrawImage(neu, 0, 0);
                    Image WeißundNeu = new Bitmap(16, 16,g);

Nun wird aber in dem Ordner wo ich das Bild speicher ein 16 x16 großes Schwarzes Bild erzeugt und leider nicht mein skalirtes Bild. Woran könnte das liegen ?

C
224 Beiträge seit 2009
vor 11 Jahren

Hi,


  //(...)  
  //Image WeißundNeu = new Bitmap(16, 16,g); //Diesen Code entfernen.
  //Du übernimmst hier nur die Auflösung, also nicht das Bild, wenn ich das richtig verstanden habe. Siehe MSDN Doku.  
  
  //Dieser Code sollte Dein Problem lösen:
  g.Dispose();
  Image WeißundNeu = (Image)weiß;

Aber schaue Dir dazu das Beispiel von Programmierhans an. Insbesondere seine Methode:


   private Image GetThumbnail(Image pImage, Rectangle pBounds)

Damit fährst Du gut.

Gruß, CoLo

H
hammlet90 Themenstarter:in
8 Beiträge seit 2013
vor 11 Jahren

Oke so ich hab jetzt mal hir und da mal rumprobiert und hab nun meine lösung.

Hir nochmal alles zusammen:


szDialogInitialDirectory = dialog.FileName.ToString();

                    Image original = new Bitmap(szDialogInitialDirectory);

                    int width = 16;
                    int height = 16;

                    double factor = original.Width / (double)original.Height;

                    if (factor > 1)
                        height = (int)(height / factor); // Querformat
                    else
                        width = (int)(width * factor); // Hochformat


                    Image neu = new Bitmap(16, 16);
                    Image dummy = original.GetThumbnailImage(width, height, null, IntPtr.Zero);
                    Graphics g = Graphics.FromImage(neu);
                    g.FillRectangle(new SolidBrush(Color.White), 0, 0, 16, 16);
                    g.DrawImage(dummy, 0, 0);
                    g.Dispose();


                    //Gucken ob die ausgewählte Datei nihct .bmp ist
                    if (Path.GetExtension(szDialogInitialDirectory).ToString() != ".bmp")
                    {
                        //wenn das Bild keine .bmp ist wird sie als solche gespeichert
                        neu.Save(Path.GetDirectoryName(szDialogInitialDirectory) + "\\" + Path.GetFileNameWithoutExtension(szDialogInitialDirectory) + ".bmp", System.Drawing.Imaging.ImageFormat.Bmp);

                        neu.Dispose();

                        original.Dispose();

                        //löschen des alten nicht .bmp fils
                        File.Delete(szDialogInitialDirectory);
                    }
                    else
                    {
                        //wenn das Bild bmp ist , aber keine 16 x 16 ist
                        if (original.Height != 16 || original.Width != 16)
                        {
                            original.Dispose();

                            //löschen des alten bmp files muss vor dem neuerstellen passiren da sonst fehler
                            File.Delete(szDialogInitialDirectory);

                            neu.Save(szDialogInitialDirectory);

                            neu.Dispose();
                        }
                        else { }
                    }

                    Bitmap bitmap = new Bitmap(Path.GetDirectoryName(szDialogInitialDirectory) + "\\" + Path.GetFileNameWithoutExtension(szDialogInitialDirectory) + ".bmp");

                    DataGridView2[3, DataGridView2.CurrentRow.Index].Value = (Image)bitmap;

                    DataGridView2.CurrentCell.Value = Path.GetFileNameWithoutExtension(szDialogInitialDirectory) + ".bmp";//dialog.SafeFileName.ToString();

                    bitmap.Dispose();

Thx für die schnelle Hilfe !
Sonst hätte ich noch lange gesucht.