C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[2]: 16bit TIff圧縮画像を非圧縮で保存する


(過去ログ 144 を表示中)

[トピック内 3 記事 (1 - 3 表示)]  << 0 >>

■84576 / inTopicNo.1)  16bit TIff圧縮画像を非圧縮で保存する
  
□投稿者/ AG (1回)-(2017/07/18(Tue) 18:18:36)

分類:[C#] 

お世話になっております。

現在C#にて、指定した画像を読み込んだ後にリネームし、保存し直すソフトを作成しています。

そこで質問なのですが、LZWで圧縮した16bit Tiff画像を、
ビット数を変えずに非圧縮で保存し直すにはどうすれば良いのでしょうか。

調べた際に、Bitmapクラスの変数に格納してから
圧縮方法を指定して保存しする方法があり、試してみたのですが、
この方法だと32bitで画像が保存されてしまい、16bitに直したとしても、
本来の色情報が失われているのではないかと考えています。

調べた内容を試した処理は以下のものになります。

private void SaveMultiTiff(string fileName, Bitmap baseImages, System.Drawing.Imaging.EncoderValue compressionScheme)
{
    //TIFFのImageCodecInfoを取得する
    System.Drawing.Imaging.ImageCodecInfo ici = null;

    //GDI+ に組み込まれたイメージ エンコーダに関する情報をすべて取得
    System.Drawing.Imaging.ImageCodecInfo[] encs = System.Drawing.Imaging.ImageCodecInfo.GetImageEncoders();
    //指定されたMimeTypeを探して見つかれば返す
    foreach (System.Drawing.Imaging.ImageCodecInfo enc in encs)
    {
        if (enc.MimeType == "image/tiff")
        {
            ici = enc;
            break;
        }
    }
    if (ici == null) return;

    Bitmap tiffImage = baseImages;
    System.Drawing.Imaging.EncoderParameters ep = null;

    //圧縮方法を指定する
    ep = new System.Drawing.Imaging.EncoderParameters(1);
    ep.Param[0] = new System.Drawing.Imaging.EncoderParameter(System.Drawing.Imaging.Encoder.Compression, (long)compressionScheme);
    tiffImage.Save(fileName, ici, ep);
    ep.Dispose();

    return;
}

[開発環境]
OS:Windows7
開発ソフト:Visual studio 2012

ご存知の方がいらっしゃいましたら、ご教授頂けると幸いです。
宜しくお願い致します。

引用返信 編集キー/
■84581 / inTopicNo.2)  Re[1]: 16bit TIff圧縮画像を非圧縮で保存する
□投稿者/ Azulean (837回)-(2017/07/18(Tue) 21:46:27)
No84576 (AG さん) に返信
> そこで質問なのですが、LZWで圧縮した16bit Tiff画像を、
> ビット数を変えずに非圧縮で保存し直すにはどうすれば良いのでしょうか。

Bitmap クラスを使わないということになるでしょうね。

Bitmap クラスは内部で GDI+ を利用しています。GDI+ のエンコーダーの説明のページを見ると、ColorDepth(色のビット数)に 16 はありません。
https://msdn.microsoft.com/en-us/library/ms533846

また、下記のページでも "Windows GDI+ version 1.0 can read 16-bits-per-channel images, but such images are converted to an 8-bits-per-channel format for processing, displaying, and saving." と述べられており、16bit TIFF の保存はできないと読み取れます。
https://msdn.microsoft.com/en-us/library/ms534412


WPF の BitmapImage クラスを用いれば対応できるとは思いますが、DispatcherObject なのでメモリリークには気をつけてください。
引用返信 編集キー/
■84584 / inTopicNo.3)  Re[2]: 16bit TIff圧縮画像を非圧縮で保存する
□投稿者/ AG (2回)-(2017/07/19(Wed) 08:51:58)
No84581 (Azulean さん) に返信

> Bitmap クラスは内部で GDI+ を利用しています。GDI+ のエンコーダーの説明のページを見ると、ColorDepth(色のビット数)に 16 はありません。
> https://msdn.microsoft.com/en-us/library/ms533846
>
> また、下記のページでも "Windows GDI+ version 1.0 can read 16-bits-per-channel images, but such images are converted to an 8-bits-per-channel format for processing, displaying, and saving." と述べられており、16bit TIFF の保存はできないと読み取れます。
> https://msdn.microsoft.com/en-us/library/ms534412
>
>
> WPF の BitmapImage クラスを用いれば対応できるとは思いますが、DispatcherObject なのでメモリリークには気をつけてください。


WPFを使用しないと対応できないのですね。
まずは、Bitmapクラスを使用しないで出来ないか調べてみようと思います。
何かあったら、また質問させていただきます。
ご教授ありがとうございました。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -