Laden...

Bitmap öffnen ohne Datei zu sperren

Erstellt von Gimmick vor 5 Jahren Letzter Beitrag vor 5 Jahren 1.984 Views
G
Gimmick Themenstarter:in
154 Beiträge seit 2015
vor 5 Jahren
Bitmap öffnen ohne Datei zu sperren

Hallo,

das ist vielleicht eine blöde Frage, aber wie öffne ich am besten ein Bild als Bitmap, ohne die Bilddatei zu sperren, ohne dass aus einem 24bit Bild ein 32bit Bitmap wird und idealer Weise ohne die Datei extra nochmal mit neuem Namen kopieren zu müssen?

Konkret läuft es folgendermaßen ab:

Ich habe eine Klasse "Bilddaten" die ein Bitmap als Input erhält und dann diverse Umwandlungen und Berechnungen durchführt.

Also sowas wie:



Bilddaten Verarbeitung = new Bilddaten();
Bitmap Input = new Bitamp(Pfad);

Verarbeitung.InputBild = Input;

double XYZ = Verarbeitung.Output1;
byte[] Pixel = Varbeitung.Layer[0];
....

Das Problem ist nun, dass die Inputbilder alle gleich heißen und in einem Ordner landen. Das alte Bild kann aber nicht überschrieben oder gelöscht werden, weil es in meinem Programm noch offen ist.

Habe mir auf Stackoverflow ein paar Posts durchgelesen, da wird u.A.


Image img;
using (var bmpTemp = new Bitmap("image_file_path"))
{
    img = new Bitmap(bmpTemp);
}

vorgeschlagen, das macht aus meinem 24bit Bild aber ein 32bit Bitmap, das kollidiert dann mit der Umwandlung in byte[] Arrays.

Hatte überlegt das Bild über


using (MemoryStream ms = new MemoryStream())
            {
                image.Save(ms, format);

                return ms.ToArray();
            }

in ein Array zu schreiben, Bitmap.Dispose() aufzurufen und das Array wieder in ein Bitmap zu schreiben.

Das erscheint mir aber irgendwie umständlich und ich hätte ja dann den doppelten oder sogar dreifachen (? Bitmap -> Array -> Bitmap) Speicherverbrauch pro Bild beim Laden.

Gibt es da elegantere Möglichkeiten?

S
248 Beiträge seit 2008
vor 5 Jahren

Hallo Gimmick,

ich würde die Daten einlesen und diese dann weiterverwenden:


            MemoryStream stream = new MemoryStream(File.ReadAllBytes(filename));
            Bitmap bitmap = new Bitmap(stream);

Grüße
spooky

30 Beiträge seit 2007
vor 5 Jahren

Hallo,

die Bitmap-Klasse sperrt immer die zugrunde liegende Datei solange das Objekt nicht disposed ist. Du kommst also um eine Kopie der Daten nicht herum, entweder direkt als Datei oder im Speicher. Wenn die Bitmaps größer sind, dann kann das durchaus Probleme bereiten, wenn du die Kopie im Speicher hältst, außerdem dauert auch das Laden des Bitmaps und das Erzeugen einer Kopie eine gewisse Zeitdauer und solange ist deine Eingabedatei dann trotzdem gesperrt. Dieses Problem hast du aber auch, wenn du direkt eine Kopie der Datei erzeugst. Für die Zeit, die es dauert, um die Kopie zu Erstellen, ist die Datei gesperrt.

Die beste Möglichkeit wäre es meiner Meinung nach, den Prozess zu ändern, der die Detei erzeugt und jedes mal eine neue Datei mit einem unterschiedlichen Namen zu verwenden. Falls das nicht möglich ist, dann musst du dich für eine Möglichkeit entscheiden.

Zum Erzeugen einer Kopie direkt im Speicher würde ich den Vorschlag von Spook verwenden.

Viele Grüße

Jens

G
Gimmick Themenstarter:in
154 Beiträge seit 2015
vor 5 Jahren

Die Art und Weise wie die Bilder ankommen kann ich leider nicht ändern, die kommen aus einem anderen Programm.


            MemoryStream stream = new MemoryStream(File.ReadAllBytes(filename));
            Bitmap bitmap = new Bitmap(stream);

Das lüppt.

Merci 😃