Canon EDSDK MemoryStream-Bild
Ich gekämpft habe mit der Canon EDSDK für eine Weile jetzt. Ich kann erfolgreich die Bibliothek zum speichern einer Datei direkt auf der Festplatte, aber ich kann nicht get ein halten des Bildes byte[] in Erinnerung. Immer wenn ich Versuch zu Marshallen.Copy() die EDSDK-Stream byte [] ich bekomme immer die folgende Fehlermeldung:
AccessViolationException: Versucht, Lesen oder schreiben von geschütztem Speicher. Dies ist Häufig ein Hinweis darauf, dass anderer Speicher beschädigt ist.
Unten ist eine der Variationen der code, den ich verwendet habe, um zu versuchen, den stream:
private uint downloadImage(IntPtr directoryItem)
{
uint err = EDSDK.EDS_ERR_OK;
IntPtr stream = IntPtr.Zero;
//Get information of the directory item.
EDSDK.EdsDirectoryItemInfo dirItemInfo;
err = EDSDK.EdsGetDirectoryItemInfo(directoryItem, out dirItemInfo);
//Create a file stream for receiving image.
if (err == EDSDK.EDS_ERR_OK)
{
err = EDSDK.EdsCreateMemoryStream(dirItemInfo.Size, out stream);
}
// Fill the stream with the resulting image
if (err == EDSDK.EDS_ERR_OK)
{
err = EDSDK.EdsDownload(directoryItem, dirItemInfo.Size, stream);
}
// Copy the stream to a byte[] and
if (err == EDSDK.EDS_ERR_OK)
{
byte[] buffer = new byte[dirItemInfo.Size];
GCHandle gcHandle = GCHandle.Alloc(buffer, GCHandleType.Pinned);
//The following line is where it blows up...
Marshal.Copy(stream, buffer, 0, (int)dirItemInfo.Size);
//... Image manipulation, show user, whatever
}
return err;
}
Haltepunkte zeigen (Durch die EdsDirectoryItemInfo Objekt), das Bild ist ja da, ich weiß nur nicht, warum ich würde immer die Ausnahme, die bin ich. Ich habe schon liebäugelt mit der Idee, die Niederlage zu akzeptieren und Lesen Sie die resultierende image von der Festplatte, dass es so leicht schreibt über die CreateFileStream Methode, aber ich sollte mich wirklich nur zum Bearbeiten des Bildes im Speicher.
Irgendwelche Ideen?
UPDATE: ich sehe dieses Verhalten in beiden Versionen 2.5 und 2.6.
- Würden Sie bitte buchen Sie Ihren code (irgendwo) zum herunterladen das Bild, das Sie nahm einfach auf die Festplatte? Ich kann gar nicht so weit kommen. Speziell, ich kann es nicht rufen Sie mein Objekt event-handler-Funktion.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich habe gerade gegoogelt für
EdsCreateMemoryStream
und gefunden ein Beispiel, in der es einen weiteren Anruf zu erhalten, den Mauszeiger aus der "memory stream".Dann können Sie
pointerToBytes
als Quelle zum Lesen aus imMarshal.Copy
.Also ich denke, dass das, was Sie gerade zu tun versucht wird, kopieren einige große Anzahl von bytes ab der Adresse, von einigen kleinen Kontrollstruktur Spitzen, von
stream
, und damit werden Sie gerade Lesen, über das Ende der Struktur.Edit: Durch die Art und Weise, Sie sind der code sieht aus, als wenn jemand sagte, Sie sollten nur eine return-Anweisung! Das ist Alter Beratung in Bezug auf Sprachen wie Fortran und C; es macht keinen Sinn, in moderne Sprachen. Dein code wäre übersichtlicher (zumindest in diesem Fall), wenn Sie sofort wieder die Fehler-code jedes mal, wenn Sie bekam einen Fehler:
(Besser noch, werfen Sie eine spezifische exception-Klasse enthält den Fehlercode und eine Zeichenfolge, die erklären, was Sie zu tun versuchten.)
Erkenne ich, dass dies ist eine alte post, aber dies ist ein vollständiges C# - snippet für das herunterladen von einem Speicher-stream. Es kann nützlich sein, für jemand anderes. Die Kamera muss so eingestellt werden, EDSDK.EdsSaveTo.Host-oder EDSDK.EdsSaveTo.Beide