Hallo zusammen
Ich habe ein ganz simples Programm. Das Programm zeigt Röntgenbilder als Vorschau an und wenn man Doppelklickt, wird das Bild im Vollbildmodus angezeigt.
Als zusätzliche Funktion gebe ich dem User die Möglichkeit, das Bild gleich noch in die Clipboard zu speichern, falls der Arzt das Bild noch braucht (für Bericht im Word oder so).
Bei meinen Tests funktionierte das ganze ohne Probleme. Ich habe dazu einfach Bilder aus dem Netz abgespeichert (+/- 50KB). Wenn ich das ganze aber nun für Röntgenbilder mache, so werden die Bilder (2,86MB) nicht in die Clipboard gespeichert.
Ist 2,86MB zu gross? Wenn ja wo liegt die Limite? Oder habe ich eventuell einen Fehler?
Mein Code sieht wie folgt aus:
private void pbSpeichern_Click(object sender, EventArgs e)
{
DataObject zuSpeicherndesBild = new DataObject(DataFormats.Bitmap, picBildVoll.Image);
Clipboard.Clear();
Clipboard.SetDataObject(zuSpeicherndesBild);
}
Eigentlich ja wirklich simpel.
Vielen Dank für euere Antworten
Vielen Dank für die Antwort
Ich habe das nun mal angeschaut und habe versucht mit SoapFormatter und BinaryFormatter die Datei irgendwie zu serialisieren.
Dadurch musste ich auch einen Stream erstellen, in welchem die serialiserte Datei reingeschrieben wird.
Wie bringe ich nun die Clipboard dazu auf diesen Stream zuzugreifen und diesen wieder zu deserialisieren?
bekommst du eine exception?
wenn das objekt nciht serialisierbar ist, dann kommt eine exception. wenn das bild zu groß ist, dann kommt auch eine exception.
es gibt ein betriebssystemabhängiges limit für den clipboard. wie groß der genau ist, kann man über die winapi ermitteln. alles was über diese größe geht, muss dann über die winapi und deren gewrappten interface implementiert werden, da das .net framework soetwas momentan nicht unterstützt. gegenwärtig gibt es im netz hierzu nur etwas kostenpflichtiges aber meines wissens keine freie oder einsehbare implementierung.
die exception kommt leider schon beim serialisieren: Allgemeiner Fehler in GDI+.
keine Ahnung was das bedeuted. mein Code sieht nun so aus:
BinaryFormatter test2 = new BinaryFormatter();
SoapFormatter test = new SoapFormatter();
System.IO.FileStream stream = new System.IO.FileStream("C:\\Temp\\stream.txt", System.IO.FileMode.Create);
test.Serialize(stream, picBildVoll.Image);
DataObject zuSpeicherndesBild = new DataObject(DataFormats.Bitmap, stream);
Clipboard.Clear();
Clipboard.SetDataObject(zuSpeicherndesBild, true);
Dabei ist es egal mit welchem Formatter ich serialisiere
Ich wusste zudem nicht, welchen Datentyp die Datei haben soll und habe mich einfach mal auf .txt entschieden.
benutze die methode .Save(stream, format) von der klasse Image. diese kann auch direkt in einen strem serialisieren. setze vor dem hinzufügen zum clipboard auf jeden fall die streamposition auf 0.
edit: und versuche es eher mit dem memorystream anstatt dem umweg über eine datei.
ok habe das Programm wieder umgebaut. Leider mit dem gleichen Resultat: Allgemeiner Fehler in GDI+.
Ich habe nach diesem Fehler gegoogelt und in einem Forum gelesen, dass man mit getBaseException() den wahren Grund für den Fehler sehen sollte. Jedoch steht da auch nur Allgemeiner Fehler in GDI+.
Nun sieht es so aus:
try
{
System.IO.MemoryStream stream = new System.IO.MemoryStream();
picBildVoll.Image.Save(stream, ImageFormat.Jpeg);
stream.Position = 0;
DataObject zuSpeicherndesBild = new DataObject(DataFormats.Bitmap, stream);
Clipboard.Clear();
Clipboard.SetDataObject(zuSpeicherndesBild, true);
}
catch (Exception ex)
{
Exception fehler = ex.GetBaseException().GetBaseException();
}