10

かなり高速な GDI+ ビットマップとして RAW 画像ファイル (特に Canon CR2 および Adob​​e DNG ファイル) を読み取る良い方法はありますか?

インストールされている画像コーデックを使用して画像を読み取り、それを画像コントロールに表示する WPF で実行されている例を見つけました。そして、この例を変更して、WPF イメージを MemoryStream に書き込み、そこからビットマップを作成することで、GDI+ ビットマップを作成しました。しかし、このプロセスは遅いです!恐ろしく遅い!私のコンピューターでは、単純な画像を開くのに約 10 秒かかります。このソリューションには WPF アセンブリへの参照も必要ですが、特に ASP.NET プロジェクトでコードを実行したいので、これは適切ではありません。

画像のバッチ変換を行うプログラムがありますが、要求されたときに画像を動的に変換することをお勧めします。

それで、何か提案はありますか?

4

3 に答える 3

6

免責事項: 私は Atalasoft で働いています。

当社のDotImage Photo Pro製品はこれを行うことができます。自分でやってみたい場合は、オープンソースの DCRaw のラッピングを調べるか、Paint.NET での方法を調べてください (RAW プラグインがあると思います)。

于 2008-10-22T21:55:15.577 に答える
3

これは dcraw の C# ポートですが、かなり古い (v8.88) ですが、新しい Canon モデルを含めるように適合させることができます:
https://sourceforge.net/projects/dcrawnet/

編集:
RAWファイルからEXIFデータを読み取るために、自分のプロジェクトで動作するようになりました:

  1. プロジェクトのプロパティを開き、[出力タイプ]を[クラス ライブラリ] に設定します。
  2. 再コンパイルします。
  3. 独自のプロジェクトで DLL への参照を追加します。
  4. 上部に追加using dcraw;します。
  5. 次のコード行を宣言します。

    DcRawState state = new DcRawState();
    state.inFilename = filename;
    state.ifp = new RawStream(filename);
    
    
    Identifier id = new Identifier(state);
    id.identify(state.ifp);
    

次に、状態内のすべての機能を確認します (RAW ファイルがサポートされていて、例外が発生しなかったと仮定します ;)

于 2010-11-23T14:06:43.267 に答える
3

DotImage Photo Pro コンポーネントはうまく機能しましたが、それを使用して生ファイルからプレビュー イメージを抽出する際に問題がありました。また、このプロジェクトの予算外です。

しかし、ここで Paint.NET 用の RAW プラグインのコードを見つけたので、私のニーズに合わせるのは非常に簡単でした。プラグインは DCRaw 実行可能ファイル ussignを実行し、ストリームProcess.Startからその出力を読み取ります。StandardOutput非常にシンプルで高速です!:-)

編集:

プラグインへのリンクはもう機能しませんが、画像を抽出するために使用したコードは次のとおりです。次のコードは、raw ファイルに保存されている jpg プレビューを抽出します。完全なイメージが必要な場合は、-e 引数を削除する必要があります。ただし、一部のカメラでは、GDI+ が読み取れない ppm イメージを取得することに注意してください。

public Stream GetImageData(string inputFile, string dcRawExe)
{


    var startInfo = new ProcessStartInfo(dcRawExe)
    {
        Arguments = "-c -e \"" + inputFile + "\"",
        RedirectStandardOutput = true,
        UseShellExecute = false
    };

    var process = Process.Start(startInfo);

    var image = Image.FromStream(process.StandardOutput.BaseStream);

    var memoryStream = new MemoryStream();
    image.Save(memoryStream, ImageFormat.Png);

    return memoryStream;
}

また、DCRaw のコピーが必要になります。このサイトの DcrawMS.exe を使用しました: http://www.insflug.org/raw/Downloads/

于 2008-10-23T09:07:43.520 に答える