Laden...

Clipboard und grosse Files

Erstellt von chanderegg vor 14 Jahren Letzter Beitrag vor 14 Jahren 711 Views
C
chanderegg Themenstarter:in
101 Beiträge seit 2008
vor 14 Jahren
Clipboard und grosse Files

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

T
433 Beiträge seit 2006
vor 14 Jahren

Hallo chanderegg,

das Objekt muss serialisierbar sein siehe Clipboard.SetDataObject.

Gruß,
Tom

C
chanderegg Themenstarter:in
101 Beiträge seit 2008
vor 14 Jahren

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?

Gelöschter Account
vor 14 Jahren

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.

C
chanderegg Themenstarter:in
101 Beiträge seit 2008
vor 14 Jahren

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.

Gelöschter Account
vor 14 Jahren

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.

F
100 Beiträge seit 2009
vor 14 Jahren

warum nicht Clipboard.SetImage ?

C
chanderegg Themenstarter:in
101 Beiträge seit 2008
vor 14 Jahren

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();
            }

T
433 Beiträge seit 2006
vor 14 Jahren

Also der schmeisst laut MSDN keine Exception wenn das Objekt nicht serialiserbar ist.
So wie ich das sehe müsste

Clipboard.SetDataObject(picBildVoll.Image);

funktionieren.

Aber fagju hat schon recht, wieso nicht SetImage?

Gruß,
Tom