2016-08-29 3 views
1

Ich versuche, die Windows.ApplicationModel.DataTransfer.Clipboard Klasse zur Verfügung zu UWP Apps zu verwenden Inhalt der Zwischenablage (besonders daran interessiert, Einfügen von Bilddaten) zu lesen.Erste große Daten aus der Zwischenablage

Hier ist mein Beispielcode:

var clipboardContent = Clipboard.GetContent(); 
if (clipboardContent.Contains(StandardDataFormats.Bitmap)) 
{ 
    var bitmap = await clipboardContent.GetBitmapAsync(); 
    if (bitmap != null) 
    { 
     var stream = (await bitmap.OpenReadAsync()).AsStream(); 
     // do something with the data in the stream 
    } 
} 

Dies funktioniert für relativ kleine Bilder in Ordnung. Aber wenn das Bild groß ist, dann clipboardContent.GetBitmapAsync() eine Ausnahme aus:

Eine Ausnahme des Typs ‚System.Runtime.InteropServices.COMException‘ in mscorlib.ni.dll aufgetreten war aber nicht in dem Benutzer behandelt Code

WinRT-Information: Das CF_BITMAP-Format, das von der Quell-App bereitgestellt wird, kann nicht in ein Stream-Objekt konvertiert werden.

Weitere Informationen: Für ist kein vollständiger Speicher verfügbar.

Ein Beispiel eines Bildes, das bewirkt, dass dies http://eoimages.gsfc.nasa.gov/images/imagerecords/79000/79765/dnb_land_ocean_ice.2012.13500x13500.A1.jpg

Auch wenn das Bild ist ~ 9,5 MB, wenn Sie es in einem Browser öffnen, und kopieren Sie sie in die Zwischenablage und dann versuchen, es in eine Paste UWP-App mit dem oben genannten Code, dann werden Sie das Problem mit nicht genügend Speicher auftreten.

Gibt es eine Möglichkeit, dies zu umgehen?

+0

Ich kann Ihr Problem nicht reproduzieren. Ich teste mit deinem Code und dem Bild, das du geliefert hast, es funktioniert gut in meiner Seite. Können Sie Einzelheiten zu Ihrer Testumgebung angeben? –

+0

Ich habe ein WebView, das eine Seite mit CKEditor + JavaScript auf dieser Seite hostet, die Einfügeaktionen erkennt und window.external.notify verwendet, um meinen C# -Code zu benachrichtigen. Ich führe dann den obigen Code aus, um die eingefügten Bilddaten zu laden, sie zu manipulieren und sie dann in den CKEditor innerhalb von WebView einzufügen. Ich denke, es hängt auch davon ab, wie viel freie mem eine Maschine hat.Ich lief auf einem Surfpro Gerät mit mehreren laufenden Apps (einschließlich Visual Studio). Ich dachte, GetBitmapAsync() würde mir erlauben, die Zwischenablage Daten kleine Stücke auf einmal zu lesen, egal wie groß es ist. Aber so scheint es nicht! –

Antwort

0

Vielen Dank für Ihr Feedback. Ich kann dieses Problem reproduzieren, wenn ich mit x86-Plattform baue und mehrere Male einfügen. Wie die zusätzlichen Informationen der Ausnahme sagten, erhielten wir diese Ausnahme wegen There is insufficient memory available to complete operation.

Wenn wir Diagnostic Tools beim Debuggen verwenden, können wir feststellen, dass, wenn wir das Bild einfügen Sie zur Verfügung gestellt, es vielen Speicher kostet (in der Nähe von 2 GB in meiner Seite) wie folgt vor:
enter image description here

So ist es möglich, dass In Low-Memory-Geräten ist nicht genügend Speicher vorhanden, um den Einfügevorgang abzuschließen.

Außerdem, obwohl das Bild nur in der Nähe von 9,5 MB ist, aber das ist im JPEG-Format, das komprimiert wurde. Und dieses Bild enthält 13500 * 13500 Pixel, wenn wir es in BMP-Format konvertieren, wird seine Größe auf etwa 521 MB erhöhen.

Ich habe dieses Problem intern gemeldet und ich werde meine Antwort aktualisieren, sobald es Fortschritte gibt. Im Moment würde ich vorschlagen, dass Sie diesen Fehler bemerken und den Benutzern einige Aufforderungen geben. Oder wenn Sie die Kopieroperation steuern, können Sie mit verzögerter Wiedergabe kopieren, indem Sie DataPackage.SetDataProvider Methode verwenden. Wie in meinem Test wird dies den Speicherbedarf signifikant reduzieren.

Verwandte Themen