- PR -

VB2005でサムネイル作成

1
投稿者投稿内容
むっく
会議室デビュー日: 2007/11/03
投稿数: 18
投稿日時: 2008-04-08 10:16
ImageListとListViewを使って、サムネイル表示をしようと思っています。
画像ファイルを読み込んで表示する分にはうまくいくのですが、
プログラム内でBitmap関数を使い、絵を描いて、
それをサムネイルとして表示しようとすると
真白に表示されてしまいます。
どうやら、ImageListにうまく登録されていないようです。

どなたか解決策をご存知の方がいらっしゃったら教えてください
よろしくお願いします。
テッテ
ベテラン
会議室デビュー日: 2008/03/16
投稿数: 91
投稿日時: 2008-04-08 13:33
引用:

むっくさんの書き込み (2008-04-08 10:16) より:
どうやら、ImageListにうまく登録されていないようです。



おそらくコードを提示していただかないことには何とも、答えようがないとも思います。
VB業務アプリケーション開発研究室でされた質問と同じですか?
同じなら、コードは提示できますよね?

ImageListとListViewを使用したサムネイル表示

このコードだと仮定して、
うまく登録されていないというのは、どういう意味でしょう?
もう少し詳しくお願いします。
デバッガで確認してみましたか?

ImageList1.Images.Add(thumbnail)

の呼び出しの時点で thumbnail には、Image オブジェクトが入っているのでしょうか?
それとも、createThumbnail の戻り値が既におかしいのでしょうか?

・・・など、まだまだ自分で確認できることはたくさんありますよね?
むっく
会議室デビュー日: 2007/11/03
投稿数: 18
投稿日時: 2008-04-08 15:12
テッテさん,すみませんでした.
ソースは前に出したスレッドと同じものです.
実は,手元のデータをなくしてしまい,
かつ前にスレッド立てていたのを忘れてしました..
すみませんでした.

デバッグは試しています.
ImageList1.Images.Add(thumbnail)
の時点で,thumbnailにはImageオブジェクトがちゃんとセットされています.
また,同じ内容をPictureBoxで書いてみたところ
きちんと描画されていたので,Bitmapの時点での描画がおかしいという
わけではないと思います.

現象としては,できあがったListView1には
ListView1.Items.Add("test")
で追加した"test"という文字のみが表示され
ImageList1が追加されていないようなんです.
ListView1の上をカーソルでなぞってみても
ImageList1らしき枠すら検出されていないので
白枠が追加されているというわけでもないようです.
なので,ImageList1に描画した内容が登録されていないのかな
と思ったわけです.
わかりにくい内容を書いてしまいすみませんでした.




-----
' 幅w、高さhのImageオブジェクトを作成
Function createThumbnail(ByVal image As Image, ByVal w As Integer, ByVal h As Integer) As Image
Dim canvas As New Bitmap(w, h)

Dim g As Graphics = Graphics.FromImage(canvas)
g.FillRectangle(New SolidBrush(Color.Blue), 0, 0, w, h)

Dim fw As Double = CDbl(w) / CDbl(image.Width)
Dim fh As Double = CDbl(h) / CDbl(image.Height)
Dim scale As Double = Math.Min(fw, fh)

Dim w2 As Integer = CInt(image.Width * scale)
Dim h2 As Integer = CInt(image.Height * scale)

g.DrawImage(image, (w - w2) \ 2, (h - h2) \ 2, w2, h2)
g.Dispose()
Return canvas
End Function

' ButtonのClickイベントのハンドラ
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

Dim width As Integer = 100
Dim height As Integer = 80
ImageList1.ImageSize = New Size(width, height)
ListView1.LargeImageList = ImageList1

    '図形描画用Bitmap
Dim bmp As New Bitmap(1006, 680)
Dim gra As Graphics = Graphics.FromImage(bmp)
gra.FillRectangle(New SolidBrush(Color.Red), 0, 0, 1006, 680)
gra.Dispose()
Dim thumbnail As Image = createThumbnail(bmp, width, height)

ImageList1.Images.Add(thumbnail)
ListView1.Items.Add("test")
End Sub
-----
テッテ
ベテラン
会議室デビュー日: 2008/03/16
投稿数: 91
投稿日時: 2008-04-08 16:06
こちらが参考になると思います。

方法 : Windows フォーム ListView コントロールのアイコンを表示する

各項目の ListViewItem.ImageIndex プロパティは設定されていますか?
このプロパティの既定値は -1 なので、既定ではイメージは表示されません。
むっく
会議室デビュー日: 2007/11/03
投稿数: 18
投稿日時: 2008-04-08 17:05
テッテさん,ありがとうございます.
テッテさんのアドバイスで無事表示することができました.
ありがとうございました.

次は,表示した画像をクリックして発生したイベント処理を
したいと思っているので,またしばらく作りながら調べてみます.
また書き込みをするかもしれませんが,その時は
アドバイスいただければと思います.
ありがとうございました.
テッテ
ベテラン
会議室デビュー日: 2008/03/16
投稿数: 91
投稿日時: 2008-04-09 10:35
書き忘れました。本題とは関係ありませんが、
コードで気になった点を1つ。
自分で生成した Brush は Dispose しなくてはなりません。

引用:

g.FillRectangle(New SolidBrush(Color.Blue), 0, 0, w, h)



これだと、ここで生成された SolidBrush の Dispose を呼び出すことができなくなります。
通常はいったん変数に入れて、以下のように Dispose するか

コード:
Dim sb As New SolidBrush(Color.Blue)
g.FillRectangle(sb, 0, 0, w, h)
sb.Dispose()



あるいは、Using を使います。

コード:
Using sb As New SolidBrush(Color.Blue)
    g.FillRectangle(sb, 0, 0, w, h)
End Using



ですが、青色の SolidBrush なら、システム定義のオブジェクトが
Brushes クラスに用意されているので、それを使う方がよいでしょう。
これは Dispose する必要がありません。(というかしてはいけない)

コード:
g.FillRectangle(Brushes.Blue, 0, 0, w, h)

むっく
会議室デビュー日: 2007/11/03
投稿数: 18
投稿日時: 2008-04-13 23:55
テッテさん.
返信が遅くなってしまい,すみませんでした.
アドバイスありがとうございます.

BrushってDisposeしなくちゃいけないんですね.
知りませんでした..
まだまだVB初心者で,わからないだらけですので
そういった点もアドバイス頂けて助かりました.
本当にありがとうございます.
1

スキルアップ/キャリアアップ(JOB@IT)