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 ?
Hi hammlet90,
spontan könntest Du die Länge und Höhe prüfen und wenn es nicht 16*16 ist:
Gruß,
CoLo
Schau Dir mal die Thumbnail-Methode in folgendem Beispiel an:
Früher war ich unentschlossen, heute bin ich mir da nicht mehr so sicher...
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 ?
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
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.