.NETライブラリでImageMagick COMオブジェクト(ImageMagickObject)を使用しようとしています。このライブラリはIronRubyから呼び出されることを意図していますが、それだけではそれほど重要ではありません。私はこのアプローチを採用したいと思います。なぜなら、現時点でImageMagickバイナリを外部プロセスと呼んでいる私の既存の呼び出しに適合するからです。 COMオブジェクトはバイナリと同じ引数をとりますが、プロセスの作成を節約し、全体的に約5倍高速です。.NETのCOMオブジェクトラッパーからSTDERR出力をリダイレクト
私の唯一のハードルは、COMオブジェクトの "比較"メソッドがその結果をSTDERRに返すことです。これもバイナリの問題ですが、それをSTDOUTにパイプするのは簡単です。私が期待していたところです。 COMオブジェクトでは、関数の戻り値から結果が得られます。
"比較"の結果を文字列バッファまたはSTDERRではなくファイルにリダイレクトするにはどうすればよいですか?
私はSTDERRに到達するの出力を停止しており、次のことを試してみましたが、予想通り、それはファイルに書き込めません:
using ImageMagickObject;
...
public class ImageMagickCOM
{
[DllImport("Kernel32.dll", SetLastError = true)]
public static extern int SetStdHandle(int device, IntPtr handle);
private const int STDOUT_HANDLE = -11;
private const int STDERR_HANDLE = -12;
private ImageMagickObject.MagickImage magickImage = null;
private FileStream filestream = null;
private StreamWriter streamwriter = null;
public ImageMagickCOM()
{
IntPtr handle;
int status;
filestream = new FileStream("output.txt", FileMode.Create);
streamwriter = new StreamWriter(filestream);
streamwriter.AutoFlush = true;
//handle = filestream.Handle; // deprecated
handle = filestream.SafeFileHandle.DangerousGetHandle(); // replaces filestream.handle
status = SetStdHandle(STDOUT_HANDLE, handle);
status = SetStdHandle(STDERR_HANDLE, handle);
Console.SetOut(streamwriter);
Console.SetError(streamwriter);
magickImage = new ImageMagickObject.MagickImage();
}
public string Compare()
{
object[] args = new object[] { "-metric", "AE", "-fuzz", "10%", "imageA.jpg", "imageB.jpg", "diff.png" };
return (string)this.magickImage.Compare(ref args);
}
public void Close()
{
if (this.magickImage != null)
{
Marshal.ReleaseComObject(magickImage);
this.magickImage = null;
}
if (this.streamwriter != null)
{
this.streamwriter.Flush();
this.streamwriter.Close();
this.streamwriter = null;
this.filestream = null;
}
}
}
のみ「比較」アクションを送信するためにSTDERRを使っているようです結果(成功指標として戻り値を使用します)。他のすべての方法(Identify、Convert、Mogrifyなど)は、期待通りに機能します。参考のため
は、それがこのような何か(IronRubyのから)呼び出される:
require 'ImagingLib.dll'
im = ImagingLib::ImageMagickCOM.new
im.compare # returns nil
im.close
そしてoutput.txtとは作成されますが、空にされます。 STDOUTまたはSTDERRに何も印刷されません。
EDITS:ストリームライターのフラッシュ/閉じると、サンプルがIronRubyからどのように使用されるかを明確にするためです。
私は運のないComposeの呼び出しの前後に明示的にバッファをフラッシュしようとしました。 – cgyDeveloper