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
Bitmap öffnen ohne Datei zu sperren
Gimmick
myCSharp.de - Member



Dabei seit:
Beiträge: 127

Themenstarter:

Bitmap öffnen ohne Datei zu sperren

beantworten | zitieren | melden

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



Dabei seit:
Beiträge: 241
Herkunft: Esslingen a.N.

beantworten | zitieren | melden

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

Avatar #avatar-4142.png


Dabei seit:
Beiträge: 30
Herkunft: Ersrode, Nordhessen

beantworten | zitieren | melden

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



Dabei seit:
Beiträge: 127

Themenstarter:

beantworten | zitieren | melden

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