C#と諸々

C#がメインで他もまぁ諸々なブログです
おかしなこと書いてたら指摘してくれると嬉しいです(´・∀・`)
つーかコメント欲しい(´・ω・`)

--/--/-- --:--
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
タグ:
トラックバック(-) | コメント(-) | このエントリーを含むはてなブックマーク
2007/09/17 21:28
けっこうややこしいのでメモ。

// using System;
// using System.Drawing;
// using System.Drawing.Imaging;
// using System.IO;

static void Main()
{
    Image page1 = new Bitmap("C:\\work\\page3.bmp");
    Image page2 = new Bitmap("C:\\work\\page3.bmp");
    Image page3 = new Bitmap("C:\\work\\page3.bmp");

    // TIFF 形式のエンコーダ。
    ImageCodecInfo[] imageEncoders = ImageCodecInfo.GetImageEncoders();
    Predicate<ImageCodecInfo> tiffEncoderPredicate =
        delegate(ImageCodecInfo input)
        {
            return (input.FormatID == ImageFormat.Tiff.Guid);
        };
    ImageCodecInfo tiffEncoder = Array.Find(imageEncoders, tiffEncoderPredicate);

    // エンコーダのパラメータ。
    EncoderParameters tiffEncoderParameters = new EncoderParameters(2);
    tiffEncoderParameters.Param[0] = new EncoderParameter(Encoder.SaveFlag, (long)EncoderValue.MultiFrame);
    tiffEncoderParameters.Param[1] = new EncoderParameter(Encoder.Compression, (long)EncoderValue.CompressionNone);

    // 作業領域となるメモリストリーム。
    MemoryStream tiffStream = new MemoryStream();
    // Save メソッドによって、1ページ目が保存され、更に Image オブジェクトとメモリストリームが関連付けられる。
    page1.Save(tiffStream, tiffEncoder, tiffEncoderParameters);

    // 2ページ目, 3ページ目の保存に使用するエンコーダのパラメータ。
    EncoderParameters pageEncoderParameters = new EncoderParameters(2);
    pageEncoderParameters.Param[0] = new EncoderParameter(Encoder.SaveFlag, (long)EncoderValue.FrameDimensionPage);
    pageEncoderParameters.Param[1] = new EncoderParameter(Encoder.Compression, (long)EncoderValue.CompressionNone);

    // 先ほどの Save メソッドで関連付けられたメモリストリームに対して保存される。
    // この操作は page1 にフレームを追加するわけではない。
    page1.SaveAdd(page2, pageEncoderParameters);
    page1.SaveAdd(page3, pageEncoderParameters);

    // メモリストリームの内容をファイルに保存する。
    File.WriteAllBytes("C:\\work\\test.tif", tiffStream.ToArray());
}



EncoderParameter のインスタンスを生成する際、EncoderValue 列挙値を long にキャストして渡しています。これは int ではなく long にしなければいけません。でないと失敗します。

サンプルなんで Dispose メソッドは呼び出してません。Image, MemoryStream  以外にも、EncoderParameters や EncoderParameter も IDisposable を実装してます。

[変更履歴]

2008/09/16
・1 ページ目の保存時に圧縮形式が指定されていなかったので、エンコーダのパラメータを追加。
・page1 オブジェクトを元に新しい Image オブジェクトを生成することで画像サイズ等が変わってしまっていたため、page1 オブジェクトを直接使用するように変更。
タグ: .NET C# 画像処理

承認待ちコメント
このコメントは管理者の承認待ちです

2009.09.17 15:00  | # [ 編集 ]












トラックバックURL↓
http://csharper.blog57.fc2.com/tb.php/158-328b3563

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。