2 Stimmen

GrayScale (von ColorMatrix) führt zu OutOfMemoryException. Warum?

Ich habe 2 Formulare, A und B. Auf Formular A klicke ich auf eine Schaltfläche, und ein Bild wird in ein PictureBox auf Formular B geladen. Und ich möchte diesem Bild einen Graustufen-Effekt verleihen, indem ich:

   public void SetGrayScale(PictureBox pb)
    {
        ColorMatrix matrix = new ColorMatrix(new float[][]
        {
            new float[] {0.299f, 0.299f, 0.299f, 0, 0},
            new float[] {0.587f, 0.587f, 0.587f, 0, 0},
            new float[] {0.114f, 0.114f, 0.114f, 0, 0},
            new float[] {     0,      0,      0, 1, 0},
            new float[] {     0,      0,      0, 0, 0}
        });

        Image image = (Bitmap)pb.Image.Clone();

        ImageAttributes attributes = new ImageAttributes();
        attributes.SetColorMatrix(matrix);

        Graphics graphics = Graphics.FromImage(image);

        graphics.DrawImage(image,
                            new Rectangle(0, 0, image.Width, image.Height),
                            0,
                            0,
                            image.Width,
                            image.Height,
                            GraphicsUnit.Pixel,
                            attributes);

        graphics.Dispose();

        pb.Image = image;
    }

Dieser Code funktioniert einwandfrei, wenn sich das PictureBox auf dem gleichen Formular (A) befindet. Wenn es sich jedoch auf Formular B befindet, wird eine OutOfMemoryException ausgelöst. Warum?

0 Stimmen

Wo wird die OutOfMemoryException ausgelöst?

0 Stimmen

@Tony: Sie sollten Fragen zu Ihrer Frage oder zu anderen Antworten beantworten, indem Sie einen Kommentar hinzufügen, anstatt jedes Mal eine neue Antwort hinzuzufügen.

1voto

ChrisF Punkte 130622

Weitere Fragen/Dinge, die du untersuchen solltest, anstatt einer tatsächlichen Antwort, leider:

  1. Wie im Kommentar zu deiner Antwort - ist das Image-Objekt korrekt?

  2. Wenn nicht, dann deutet das darauf hin, dass etwas mit dem an diese Methode übergebenen PictureBox-Objekt nicht stimmt oder dass du nicht richtig auf das Bild der PictureBox zugreifen kannst.

Mein erster Gedanke war das Threading, aber beide Formulare sollten im UI-Thread sein.

0voto

Tony Punkte 12013

Ok, ich habe es behoben :) Die Lösung besteht darin, dass ich ein Bitmap-Objekt aus dem OpenDialog.FileName erstellen und später PictureBox.Image = myBitmap setzen musste

Ich habe es am Anfang nicht gemacht, ich habe nur PictureBox.Load(OpenDialog.FileName) eingestellt. Und das war mein Fehler.

Ok, danke für Ihre Zusammenarbeit, ChrisF! :)

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X