2011-01-13 2 views
3

ImageMagickのWindowsインストーラに付属のImageMagickObject COMコンポーネントを使用しようとしていますが、COM参照としてC#プロジェクトにインポートされています。これまで、ディスク上のあるファイルからディスク上の別のファイルにイメージを変換するために、これを使用することができました。私は、ファイルをメモリに変換し、ライブラリに含まれているArrayTest.vbsファイルに示されているようにバイト配列で返すようにしています。誰もこれを成功させたのですか?ドキュメントは厳しく...この機能に欠けているImageMagick in C#:変換呼び出しからバイト配列を取得しますか?

マイコード:ArrayTest.vbsから

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

彼らのサンプル:

Dim img 
Dim myarray(1) 

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

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

あなたがImageMagickのに慣れていない場合は、「ヌル:ヌル画像を指定するビルトインタイプです。 "-profile"と "8BIM:iptctext.txt"はConvert呼び出しに渡されるコマンドラインパラメータであり、配列は本質的に出力です。これらの例では、myarrayは新たに変換されたイメージのバイト配列になります。私のコードでは、myarrayは変更されていません。助けて!!

+0

出力はmyarrayではなく、結果変数であるようです。結果の内容は何ですか? –

答えて

0

ImageMagickObjectは、バイナリを実行するプロセスを作成するオーバーヘッドなしで、ほとんどのImageMagickバイナリに同等の機能を提供することを目的としています。 "Convert"の場合、成功した場合に期待される出力(またはImageMagickObjectの戻り値)はありません。あなたは、C#からこれをしたい場合、私はあなたが2つのオプションがあります伝えることができるものから、

  1. は一時ファイルに画像を変換してからGDI+ Graphicsを使用してそれを読みます。
  2. ImageMagickのC++ APIの.NETラッパーを作成します。 ImageMagickNETをチェックすることで、頭を良くすることができます。
+0

残念ながらオプション1を使用することはできません。私たちは、GDI +がサポートしていないCMYK JPEGを扱っています。 私はImageMagickのラッパーをしたくありません。ImageMagickNETを成功裏に使ってみました。このような開発上の問題がないにもかかわらず、プロセスがWebサーバー上の保護されたメモリに読み書きしようとするメモリエラーに陥る可能性があります。 Convert *は何らかの戻り値の型を持つべきです - それ以外の場合、変換されたファイルはどこに終了しますか? ImageMagickObjectに含まれているサンプルコードは、結果をmyArrayオブジェクトに「返す」ことを示しています。 C#ではそのようなことはしません。 – rswafford

+0

私は#2と同様のメモリ問題を抱えていたので、私はそのアプローチを放棄したことを非難しません。 – cgyDeveloper

0

あなたはImageMagickObjectソースから呼び出しているメソッドのシグネチャは次のとおりです。

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

これは、2つの引数、1つの戻り値を出し意志を受け入れる必要があることを暗示しているようだが、それが失敗しました単一のref object[]引数以外でコンパイルしてください。

私はCOMプログラミングに慣れていないので、誰かがこれをよく知っていて、正しいC#コードに導くのに役立ちます。

また

(私はあなたが気づいた確信しているとして)、Visual Studioので検出されたメソッドのシグネチャは、Convertフォームparams object[]で引数を取りますが、それだけで、それは誤りとしてそれをマークしていても1つのref object[]引数(でコンパイルすることを意味しますコンパイルの前に)。

+0

ええと - それは私が遭遇したものです。私たちはこの時点でImageMagickを放棄し、私が信じているJpegLibを使用しています。フォローアップ...ありがとう!ありがとう! – rswafford

関連する問題