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

多重ページの表示方法

環境/言語:[OS : Windows 2000 Professional / 言語 : Visual Basic .NET]
分類:[.NET]

初めて投稿致します。
拙い文章ではありますが、アドバイス頂けるようお願い致します。

PictureBoxのイメージに多重ページイメージ(一つのファイル中に複数のイメージが存在)を表示させたいのですが表示できません。
通常イメージ(一つのファイル中に1個のイメージ)は表示できるのですが、多重ページになると先頭イメージのみの表示になり次イメージが表示できません。
表示させたいイメージの拡張子は.tifです。

ヘルプで「イメージ」で検索したところ「Image.FrameDimensionsListプロパティ」があり、「多重フレームイメージの情報を返します。」と書かれていましたが、小生の疑問の中身と合致しているかどうかも分からず、又、プログラムの組み方も検討が付かず右往左往しております。

他にもネットの検索エンジンや参考書等で調べましたが何処にも該当しそうな物が見当たらず、苦慮しております。

小生、プログラムを初めて間もない為、説明がわかり難いと思いますが、アドバイス頂けますようお願い致します。
> ヘルプで「イメージ」で検索したところ「Image.FrameDimensionsListプロパティ」があり、「多重フレームイメージの情報を返します。」と書かれていましたが、小生の疑問の中身と合致しているかどうかも分からず、又、プログラムの組み方も検討が付かず右往左往しております。
> 他にもネットの検索エンジンや参考書等で調べましたが何処にも該当しそうな物が見当たらず、苦慮しております。

 FrameDimensionsList が関連するかも知れないと思われたのなら、それをキーワードに検索してみれば良かったのでは?
 検索していたら、こちらの管理人さまが発行しているメルマガの情報に辿り着いたはずです。
#私はそうして見つけました。

.NETプログラミング研究 第49号
・マルチTIFFやアニメーションGIFに含まれるすべてのイメージを表示するには?
http://backno.mag2.com/reader/BackBody?id=200501110600000000104516000


 なお、 TIFF をキーワードに過去ログ検索してみたら、この記事の基になったスレッドが見つかりました。検索して見つけられないときは、キーワードを絞るようにしましょう。
■No8851に返信(深山さんの記事)
>
>  FrameDimensionsList が関連するかも知れないと思われたのなら、それをキーワードに検索してみれば良かったのでは?
>  検索していたら、こちらの管理人さまが発行しているメルマガの情報に辿り着いたはずです。
> #私はそうして見つけました。
>
> .NETプログラミング研究 第49号
> ・マルチTIFFやアニメーションGIFに含まれるすべてのイメージを表示するには?
> http://backno.mag2.com/reader/BackBody?id=200501110600000000104516000
>
>
>  なお、 TIFF をキーワードに過去ログ検索してみたら、この記事の基になったスレッドが見つかりました。検索して見つけられないときは、キーワードを絞るようにしましょう。

有難うございます。早速、参考にしてプログラムしてみます。
又、小生の勉強不足の為ご迷惑をお掛けして申し訳有りません。
以後、このような検索ミスが無いよう致します。
大変有難う御座いました。
> 有難うございます。早速、参考にしてプログラムしてみます。
> 又、小生の勉強不足の為ご迷惑をお掛けして申し訳有りません。
> 以後、このような検索ミスが無いよう致します。
> 大変有難う御座いました。

プログラムを行なったのですが、PictureBox内に表示がされませんでした。
各値が来ているかどうかMsgboxで確認してみたのですが、
FrameCountの値fd_countは正確にかえってきてましたが、for文の中にある
img.SelectAcutiveFrame(fd,i)の値が全て0になっています。
これが原因でしょうか?
コードの中身は過去ログの中にあったものを一部変えただけです。


'画像ファイルのパス
Dim filePath As String = 検索結果データ(現在ページ)

Dim g As Graphics = プレビュー縦.CreateGraphics()

'画像の読み込み
Dim img As Image = Image.FromFile(filePath)
'FrameDimensionを取得
Dim fd As New FrameDimension(img.FrameDimensionsList(0))
'フレーム数を取得
Dim fd_count As Integer = img.GetFrameCount(fd)
Dim y As Integer = 0
Dim i As Integer
For i = 0 To fd_count - 1
'フレームを選択
img.SelectActiveFrame(fd, i)
MsgBox(img.SelectActiveFrame(fd, i))
'画像を表示
g.DrawImage(img, 0, y, img.Width, img.Height)
y += img.Height
Next i
img.Dispose()
g.Dispose()
> プログラムを行なったのですが、PictureBox内に表示がされませんでした。

 本当に表示されていないのでしょうか?
 手元に複数ページを持つ TIFF ファイルがなかったので GIF ファイルで代用したのですけど、ご提示頂いたプログラムで問題なく描画されましたよ。
 この処理をどこでなされているのか存じませんが、描画されたものが消えてしまっているような印象を受けました。次の Tips の中段辺りに書かれている内容はご理解されてますでしょうか?
#描画処理を Form.Load イベントで行ったのではと疑っています。勘違いでしたらごめんなさいm(__)m

画像ファイルを表示する
http://dobon.net/vb/dotnet/graphics/drawimage.html


> img.SelectAcutiveFrame(fd,i)の値が全て0になっています。
> これが原因でしょうか?

 少し調べてみたのですけど、これについてはよく解りませんでした。想像でしかないのですが FrameDimensionsList のインデックスと一致するのかも知れません。
 こちらでも同様の結果となったものの画像は切替わって表示されましたので、取り敢えず問題ではないと思います。
#根拠としては弱いですが(汗)



 以下余談になります。

> img.SelectActiveFrame(fd, i)
> MsgBox(img.SelectActiveFrame(fd, i))
のようにすると、 SelectActiveFrame メソッドは二度実行されることになります。ここでは問題になりませんが、実行回数が動作に影響するものもあるでしょう。変数で戻り値を受けるなりしたほうが良いかと。
 また、 MsgBox 関数などを使うより Console.WriteLine メソッドや Debug.WriteLine メソッドを使用したほうがデバッグもし易いと思います。よろしければ試してみてください。
#場合によってはダイアログを表示することで挙動が変わることもありますし。
■No8873に返信(深山さんの記事)
深山さんレス有難うございます。
言われる通りForm.Lordイベントで処理を行なっています。
何か問題でもあるのでしょうか?

今、作成している物はデータベースから検索処理を行なって、別のFormに検索ヒットしたデータのファイルパスを渡して表示させるものです。残す所、マルチTIFFの処理だけとなっています。

頂いた、アドバイスと資料を熟読理解し取り組んで行きます。
知識不足の小生の為に時間をさいて頂いて大変恐縮しております。
また、何か有りましたらアドバイス頂きたく思います。
> 言われる通りForm.Lordイベントで処理を行なっています。
> 何か問題でもあるのでしょうか?

 問題があると言うか‥‥実際に表示されていないことは問題ですよね?(^_^;)

 試しに描画処理の前で
Me.Visible = True
とかしてみてください。恐らく一瞬だけ意図した表示が見られると思います。
 また実験用にボタンを一つ配置し、その Click イベントで同じ処理をしてみてください。やはり表示はされると思います。しかし、他のウィンドウの後ろに隠れたり最小化したりするとその表示は消えてしまうでしょう。

 ヘルプなどに目を通しても、それだけではなかなか理解できないかも知れません。色々なテストコードを作成して動作確認することで理解の手助けになると思います。
#いや、私自身は読んだだけじゃよく解らないってだけですが ;-)
■No8896に返信(深山さんの記事)
有難うございます。
今現在、色々なテスト動作をしています。
亀の歩みですが、確実に前に進んでいっております。
表示も段々思うように表示出来はじめました。
Form_Lordで表示させていたのでなかなか表示出来なかったようです。
深山さんのアドバイスのおかげで気付く事が出来ました。
無事表示出来る様になりました。
色々アドバイス頂いた深山さん
有難うございました。
解決済み!

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