DOBON.NET DOBON.NETプログラミング掲示板過去ログ

2値のtifデータを24ビットカラーのbitmapへ

環境/言語:[XP VB.NET .NET Framework1.0]
分類:[.NET]

こちらのサイトの.NetTips の「品質を指定して画像を保存する」を応用して、

「2値のtifデータを読み込み、24ビットカラーのbitmapデータとして保存する。」

というのを目的に作ってみたのですが、
保存されたものは、ビットの深さが1のbitmapデータでした。
(PixelFormatで調べて見るとFormat1bppIndexedです。)
安易に、”Encoder.ColorDepth, 24L”としたぐらいでは駄目なのでしょうか?
どなたか、ご教授の程よろしくお願いいたします。


Public Shared Sub SaveImage(ByVal fileName As String)
Dim bmp As Bitmap = New Bitmap(fileName)
Dim eps As New System.Drawing.Imaging.EncoderParameters(1)
Dim ep As New System.Drawing.Imaging.EncoderParameter( _
System.Drawing.Imaging.Encoder.ColorDepth, 24L)
eps.Param(0) = ep

Dim ici As System.Drawing.Imaging.ImageCodecInfo
ici = GetEncoderInfo("image/bmp")

Dim ext As String = ici.FilenameExtension.Split(";"c)(0)
ext = System.IO.Path.GetExtension(ext).ToLower()

Dim saveName As String = System.IO.Path.ChangeExtension(fileName, ext)

bmp.Save(saveName, ici, eps)
End Sub

Private Shared Function GetEncoderInfo(ByVal mineType As String) _
As System.Drawing.Imaging.ImageCodecInfo

Dim encs() As System.Drawing.Imaging.ImageCodecInfo = _
System.Drawing.Imaging.ImageCodecInfo.GetImageEncoders()

Dim enc As System.Drawing.Imaging.ImageCodecInfo
For Each enc In encs
If enc.MimeType = mineType Then
Return enc
End If
Next
Return Nothing
End Function
参考元 http://dobon.net/vb/dotnet/graphics/encoderparameters.html
■No19389に返信(さかなさんの記事)
> こちらのサイトの.NetTips の「品質を指定して画像を保存する」を応用して、
>
> 「2値のtifデータを読み込み、24ビットカラーのbitmapデータとして保存する」
>
> というのを目的に作ってみたのですが、
> 保存されたものは、ビットの深さが1のbitmapデータでした。
> (PixelFormatで調べて見るとFormat1bppIndexedです。)
> 安易に、”Encoder.ColorDepth, 24L”としたぐらいでは駄目なのでしょうか?
> どなたか、ご教授の程よろしくお願いいたします。
>
>
> Public Shared Sub SaveImage(ByVal fileName As String)
> Dim bmp As Bitmap = New Bitmap(fileName)
> Dim eps As New System.Drawing.Imaging.EncoderParameters(1)
> Dim ep As New System.Drawing.Imaging.EncoderParameter( _
> System.Drawing.Imaging.Encoder.ColorDepth, 24L)
> eps.Param(0) = ep
>
> Dim ici As System.Drawing.Imaging.ImageCodecInfo
> ici = GetEncoderInfo("image/bmp")
>
> Dim ext As String = ici.FilenameExtension.Split(";"c)(0)
> ext = System.IO.Path.GetExtension(ext).ToLower()
>
> Dim saveName As String = System.IO.Path.ChangeExtension(fileName, ext)
>
> bmp.Save(saveName, ici, eps)
> End Sub
>
> Private Shared Function GetEncoderInfo(ByVal mineType As String) _
> As System.Drawing.Imaging.ImageCodecInfo
>
> Dim encs() As System.Drawing.Imaging.ImageCodecInfo = _
> System.Drawing.Imaging.ImageCodecInfo.GetImageEncoders()
>
> Dim enc As System.Drawing.Imaging.ImageCodecInfo
> For Each enc In encs
> If enc.MimeType = mineType Then
> Return enc
> End If
> Next
> Return Nothing
> End Function
> 参考元 http://dobon.net/vb/dotnet/graphics/encoderparameters.html
■No19390に返信(Hongliangさんの記事)
Hongliangさん 
返信をいただきありがとうございます。
これはHongliangさんのページに書いてあるよ。ということでしょうか?
それとも、なにか、書き方が間違っていましたでしょうか?
こういった所で質問するのが初めてなもので、失礼な事がありましたら教えていただけますでしょうか?
2007/03/29(Thu) 22:29:23 編集(投稿者)

うを!? 書き込み結果確認してなかった。

申し訳ありません。書いたつもりが書けてなかったみたいです。
// ブラウザの戻るをやったからかな……。
私の不注意でした。お気を悪くなさらないで下さい。


さて、改めて。
EncoderParameters を使った Save は、今のところ TIFF/JPEG の画像のみに有効であるようです。
多分今後も変わらないでしょう。

やるとするなら、自分で Bitmap インスタンスを新しく生成して、それに対して描画するという事になるかと思います。
解像度の指定は、たくさんある Bitmap コンストラクタのバリエーションのうち PixelFormat を指定するのを利用します。
なお、TIFF の 2 枚目以降の画像を SelectActiveFrame しているときにその画像を DrawImage の引数に渡すと例外が投げられるようです。
これに対処するには、SelectActiveFrame した後そのインスタンスを引数にして Bitmap を作成し、それを DrawImage って手順になるかと思います。

何か分からない点があればご遠慮せず仰ってください。


// ってこれはこれで自分自身にレス付けちゃったし……orz
// ほんとすいません、さかな さん。
■No19395に返信(Hongliangさんの記事)
> 2007/03/29(Thu) 22:29:23 編集(投稿者)
>
あ〜よかった。なにかいけないことをしたかと思ってあせっておりました。

> 私の不注意でした。お気を悪くなさらないで下さい。

いえいえ、どうもご丁寧にありがとうございます。
>
> さて、改めて。
> EncoderParameters を使った Save は、今のところ TIFF/JPEG の画像のみに有効であるようです。
> 多分今後も変わらないでしょう。


そうなんですか。なにか方法があるのではと、検索してみたのですが、見つからない訳ですね。こちらで質問してみてよかったです。

> やるとするなら、自分で Bitmap インスタンスを新しく生成して、それに対して描画するという事になるかと思います。
> 解像度の指定は、たくさんある Bitmap コンストラクタのバリエーションのうち PixelFormat を指定するのを利用します。
> なお、TIFF の 2 枚目以降の画像を SelectActiveFrame しているときにその画像を DrawImage の引数に渡すと例外が投げられるようです。
> これに対処するには、SelectActiveFrame した後そのインスタンスを引数にして Bitmap を作成し、それを DrawImage って手順になるかと思います。
>
> 何か分からない点があればご遠慮せず仰ってください。
>
>
> // ってこれはこれで自分自身にレス付けちゃったし……orz
> // ほんとすいません、さかな さん。

Hongliangさん、どうもありがとうございます。こちらを参考に今から作成してみます。
本来であれば、なにか形を作ってから返信するべきなのでしょうが、まずはお礼を言いたくて書き込んじゃいました。

DOBON.NET | プログラミング道 | プログラミング掲示板