Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Bilder Umwandeln und in DB speichern
hammlet90
myCSharp.de - Member



Dabei seit:
Beiträge: 8

Themenstarter:

Bilder Umwandeln und in DB speichern

beantworten | zitieren | melden

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 16*13 wird und nicht 16*16. Gibt es eine Möglichkeit wenn das Bild 16*13 ist die letzten 3, schwarz oder weiß zu färben, das das Bild auf 16*16 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 ?
Dieser Beitrag wurde 3 mal editiert, zum letzten Mal von hammlet90 am .
private Nachricht | Beiträge des Benutzers
CoLo
myCSharp.de - Member



Dabei seit:
Beiträge: 224

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
Programmierhans
myCSharp.de - Experte

Avatar #avatar-1651.gif


Dabei seit:
Beiträge: 4.221
Herkunft: Zentralschweiz

beantworten | zitieren | melden

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...
private Nachricht | Beiträge des Benutzers
hammlet90
myCSharp.de - Member



Dabei seit:
Beiträge: 8

Themenstarter:

beantworten | zitieren | melden

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 ?
private Nachricht | Beiträge des Benutzers
CoLo
myCSharp.de - Member



Dabei seit:
Beiträge: 224

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
hammlet90
myCSharp.de - Member



Dabei seit:
Beiträge: 8

Themenstarter:

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers