All-About調査室 Annex

ふと湧いた疑問や巷を漂うウワサを全部アバウト~に調査・検証
<OCNから漂着 流浪の調査室>

VB.netで画像をTiff保存してみる

2017-10-06 22:45:10 | VB.net

.netはあまり好きではないし、苦手である。
とはいえ、コレを使わないと画像表示はままならないし、
複雑な処理を「さくっ」と処理してくれる強力なツールでもあり避けては通れない。

しかしながら、その強力なツールでもある各種のClassの仕様がイマイチわからない。
一所懸命ぐぐっても疑問が解消しないまま、
「動いてんだから良しとするか。プロじゃないんだし・・・」
となることがままある。
(つーか、ほぼ毎回だね、完成確証が持てないのは)

今回、「カラーBMP画像ファイルを読み込んで画面表示し、
それをTiffファイルに保存する」というだけで見事にドロ沼にはまったので
備忘録を兼ねて顛末を紹介しよう。

最初にVB.net(Visual Studio Express 2013)で作ったのが以下。

Imports System.Drawing.Imaging
Public Class Form1
    Private PicBox As System.Windows.Forms.PictureBox
    Private Sub Form1_Load(sender As Object, e As EventArgs) _
        Handles MyBase.Load

        ' 通常はVSのフォームデザイナでプロパティ指定する
        ' Form1
        Me.Size = New Size(350, 350)
        Me.AutoScroll = True
        ' PictureBox
        PicBox = New System.Windows.Forms.PictureBox()
        With PicBox
            .SizeMode = PictureBoxSizeMode.AutoSize
            .Image = System.Drawing.Image.FromFile("E:\Original.bmp")
        End With

        If PicBox.Image.PixelFormat <> PixelFormat.Format24bppRgb Then
            Exit Sub ' RGB24bit Color以外は処理中断
        End If

        Controls.Add(PicBox)

        PicBox.Image.Save("E:\Test1.tif", Imaging.ImageFormat.Tiff)

    End Sub
End Class

青文字部分はVSのフォームデザイナを使ってプロパティ指定するので
こんなコード記述はしないのが通常だろう。
読み込んだBMP画像ファイルが24bitカラーかをチェックする部分も
自分で対象ファイルを管理すれば必須ではないので、
(ここを削除すれば、最初の“Imports ・・・”も必要ない)
実質コードは“PicBox.Image.Save・・・”の一文だけで済む。
さっすが、お手軽.net!

・・・なんだけど。
できあがったTiffファイルを正常に表示できないソフトがごくまれに存在する。

なぜ正常表示できない場合があるかというと、
このTiffファイルはLZW圧縮のTiffになっており、
そのLZW圧縮Tiffに対応していないソフトがごくまれに存在するからだ。

ちなみに出来上がったTiffのタグを解析すると以下の記述がある。
(VB.netで作ったTiffは最初のヘッダ以外はファイル後端にタグがある)

0301 0300 01000000 05000000 (バイトオーダーはリトルエンディアン)

0301 : ID#103(16進) Compression Tag 圧縮形式を示す
0300 : Short型データ
01000000 : データ数1個
05000000 : 圧縮形式5番 LZW圧縮方式をあらわす

表示できないのは、大抵は古いフリーソフトで実害はめったにないのだが
(可逆圧縮でファイルサイズが3~4割小さくなるので
むしろ好都合という人もいるだろうけど)
確実に表示できるように非圧縮Tiffにしてみたい。 

- つづく -



最新の画像もっと見る

コメントを投稿

ブログ作成者から承認されるまでコメントは反映されません。