2011-01-13 7 views
3

Ich versuche, die ImageMagickObject COM-Komponente zu verwenden, die mit dem Windows Installer für ImageMagick geliefert wird, das in meinem C# -Projekt als eine COM-Referenz importiert wird. Bisher war ich in der Lage, Bilder von einer Datei auf einer anderen Datei auf der Festplatte zu konvertieren. Ich versuche, es zu erhalten, um die Datei im Speicher zu konvertieren und es in einem Bytearray zurückzugeben, wie in der ArrayTest.vbs-Datei gezeigt wird, die mit der Bibliothek enthalten wird. Hat jemand das schon einmal erfolgreich gemacht? Dokumentation fehlt stark zu dieser Funktion ...ImageMagick in C#: Get Byte-Array von Convert Call?

Mein Code:

MagickImageClass _magic = new MagickImageClass(); 
object[] myarray = new object[1]; 
myarray[0] = "JPEG:"; 

object[] args = new object[] { tbFilename.Text, "-colorspace", "cmyk", "-resize", "50%", myarray }; 
var result = _magic.Convert(ref args); 

Ihre Probe aus ArrayTest.vbs:

Dim img 
Dim myarray(1) 

Set img = CreateObject("ImageMagickObject.MagickImage.1") 
myarray(0)="8BIM:" 

msgs = img.Convert("null:","-profile","8BIMTEXT:iptctext.txt",myarray) 

Wenn Sie nicht vertraut mit ImageMagick sind „null: "ist ein eingebauter Typ, der ein Nullbild angibt. "-profile" und "8BIM: iptctext.txt" sind Befehlszeilenparameter, die an den Convert-Aufruf übergeben werden, und mein Array ist im Wesentlichen die Ausgabe. In ihrem Beispiel endet Myarray mit einem Byte-Array des neu konvertierten Bildes. In meinem Code ist myarray unverändert. Hilfe!!

+0

Die Ausgabe scheint die Ergebnisvariable zu sein, nicht myarray. Was ist der Inhalt des Ergebnisses? –

Antwort

0

Das ImageMagickObject bietet die gleichen Funktionen für die meisten ImageMagick-Binärdateien, ohne dass ein Prozess zum Ausführen der Binärdateien erforderlich ist. Im Falle von "Convert" gibt es keine erwartete Ausgabe (oder ImageMagickObject Rückgabewert) im Erfolgsfall.

Von dem, was ich kann Ihnen zwei Möglichkeiten sagen haben, wenn Sie diese # von C wollen:

  1. Konvertieren Sie das Bild in eine temporäre Datei und dann lesen Sie es GDI+ Graphics in Verwendung.
  2. Erstellen Sie einen .NET-Wrapper für die C++ - API für ImageMagick. Sie können einen guten Vorsprung bekommen, indem Sie auschecken.
+0

Ich kann die Option 1 leider nicht verwenden - wir haben es mit CMYK JPEGs zu tun, die GDI + nicht unterstützt. Ich möchte keinen Wrapper für ImageMagick erstellen - wir haben versucht, ImageMagickNET ohne Erfolg zu verwenden. Es kam zu Speicherfehlern, bei denen der Prozess versuchen würde, in den geschützten Speicher auf dem Webserver zu lesen oder zu schreiben, obwohl es keine Probleme bei der Entwicklung gab. Convert * sollte * einen Rückgabetyp irgendeiner Art haben - wo würde seine konvertierte Datei enden? Der Beispielcode, den sie mit ImageMagickObject einschließen, zeigt an, dass sie das Ergebnis in das myarray-Objekt "zurückgibt". In C# tut es so etwas nicht. – rswafford

+0

Ich sah ähnliche Speicherprobleme mit # 2, also mache ich Ihnen keine Vorwürfe dafür, diesen Ansatz aufzugeben. – cgyDeveloper

0

Die Signatur für die Methode, die Sie aus der ImageMagickObject Quelle nennen ist:

[ vararg, id(6) ] HRESULT Convert([ in, out, satype(VARIANT) ] SAFEARRAY * *pArrayVar, [ out, retval ] VARIANT * pVar); 

Dies scheint zu implizieren, dass es zwei Argumente akzeptieren sollte man das wird ein Rückgabewert aus, aber es funktioniert nicht auf kompilieren mit etwas anderem als einem einzigen ref object[] Argument.

Ich bin nicht sehr vertraut mit COM-Programmierung, also hoffentlich jemand mehr Experten entdeckt dies und kann Ihnen helfen, den richtigen C# -Code zu verweisen.

auch (wie ich bin sicher, dass Sie bemerken), impliziert die Methodensignatur von Visual Studio festgestellt, dass Convert Argumente in Form nimmt params object[], aber es wird nur mit einem ref object[] Argumente kompiliert (auch wenn es als Fehler markiert vor der Kompilierung).

+0

Ja - genau das ist mir eingefallen. Wir haben an dieser Stelle ImageMagick verlassen und verwenden JpegLib, glaube ich. Danke fürs Nachfassen ... Prost! – rswafford