hallo,
Ich möchte gern ein Bild verkleiner und abspeichern.
Hierfür verwende ich folgenden Code:
//scale image proportional
public static Image Resize(Image originalImage, double newWidth_p)
{
double dlFaktor = newWidth_p / originalImage.Width;
double newHeight = dlFaktor * originalImage.Height;
double newWidth = dlFaktor * originalImage.Width;
Graphics newGraphics = Graphics.FromImage(originalImage);
newGraphics.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.Bilinear;
Bitmap resizedImage = new Bitmap((int)newWidth, (int)newHeight);
Rectangle DrawingArea = new Rectangle(0, 0, (int)newWidth, (int)newHeight);
newGraphics.DrawImage(resizedImage, DrawingArea);
return resizedImage;
}
Jedoch ist das ouput Bild komplett Schwarz.
Mache ich generell etwas falsch?
Der Aufruf sieht wie folgt aus:
private void button1_Click(object sender, EventArgs e)
{
OpenFileDialog OpenMyFiles = new OpenFileDialog();
if (OpenMyFiles.ShowDialog() == DialogResult.OK)
{
Image currentImage = Image.FromFile(OpenMyFiles.FileName);
Image resizedImage = ImageScale.Resize(currentImage, 480);
resizedImage.Save(@"C:\Dokumente und Einstellungen\user1\Desktop\test.jpg", System.Drawing.Imaging.ImageFormat.Jpeg);
}
}
Aller Wahrscheinlichkeit nach wird das Weltall von einem Rudel Irrer regiert.
Bitmap resizedImage = new Bitmap((int)newWidth, (int)newHeight);
Rectangle DrawingArea = new Rectangle(0, 0, (int)newWidth, (int)newHeight);
newGraphics.DrawImage(resizedImage, DrawingArea);
return resizedImage;
Nur mal so als Frage. Wo füllst du resizedImage?
scheinbar nirgendswo, sonst wärs ja nicht schwarz, aber damit hilfst du mir nicht weiter.
Wenn ich das original Bild nehme (input), dann bringt das DrawImage gar nichts, das Bild ist immernoch genauso groß wie vorher. Also dachte ich, ich müßte ein neues erstellen und mein Graphics Objekt zeichnet dann dessen Inhalt in das angegebene Bild.
Scheinbar nicht.
Aller Wahrscheinlichkeit nach wird das Weltall von einem Rudel Irrer regiert.
Probier mal folgendes
public static Image Resize(Image originalImage, double newWidth_p)
{
double dlFaktor = newWidth_p / originalImage.Width;
double newHeight = dlFaktor * originalImage.Height;
double newWidth = dlFaktor * originalImage.Width;
Bitmap resizedImage = new Bitmap((int)newWidth, (int)newHeight);
Graphics newGraphics = Graphics.FromImage(resizedImage);
newGraphics.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.Bilinear;
Rectangle DrawingArea = new Rectangle(0, 0, (int)newWidth, (int)newHeight);
newGraphics.DrawImage(originalImage, DrawingArea);
return resizedImage;
}
Achso. Wenn das noch immer nicht will kanns auch an der Konvertierung liegen, die wir hier bisher ja nicht extra durchführen. Dann einfach noch (Image) vor resizedImage setzen beim erstellen des Graphics-Objektes und beim return.
Dann sollte es aber eigentlich funktionieren.
... alles Klar. DrawImage zeichnet in den aktuellen Graphics kontext. Das macht natürlich sinn.
Danke!
Aller Wahrscheinlichkeit nach wird das Weltall von einem Rudel Irrer regiert.
Hallo inva,
hier findest du die Einstellungen, die für ein hochwertiges Ergebnis wichtig sind: [gelöst] Bitmap-Randproblem beim Verkleinern mit InterpolationMode.HighQualityBilinear
herbivore