- - PR -
VB2005でサムネイル作成
1
投稿者 | 投稿内容 | ||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2008-04-08 10:16
ImageListとListViewを使って、サムネイル表示をしようと思っています。
画像ファイルを読み込んで表示する分にはうまくいくのですが、 プログラム内でBitmap関数を使い、絵を描いて、 それをサムネイルとして表示しようとすると 真白に表示されてしまいます。 どうやら、ImageListにうまく登録されていないようです。 どなたか解決策をご存知の方がいらっしゃったら教えてください よろしくお願いします。 | ||||||||||||||||
|
投稿日時: 2008-04-08 13:33
おそらくコードを提示していただかないことには何とも、答えようがないとも思います。 VB業務アプリケーション開発研究室でされた質問と同じですか? 同じなら、コードは提示できますよね? ImageListとListViewを使用したサムネイル表示 このコードだと仮定して、 うまく登録されていないというのは、どういう意味でしょう? もう少し詳しくお願いします。 デバッガで確認してみましたか? ImageList1.Images.Add(thumbnail) の呼び出しの時点で thumbnail には、Image オブジェクトが入っているのでしょうか? それとも、createThumbnail の戻り値が既におかしいのでしょうか? ・・・など、まだまだ自分で確認できることはたくさんありますよね? | ||||||||||||||||
|
投稿日時: 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-04-08 16:06
こちらが参考になると思います。
方法 : Windows フォーム ListView コントロールのアイコンを表示する 各項目の ListViewItem.ImageIndex プロパティは設定されていますか? このプロパティの既定値は -1 なので、既定ではイメージは表示されません。 | ||||||||||||||||
|
投稿日時: 2008-04-08 17:05
テッテさん,ありがとうございます.
テッテさんのアドバイスで無事表示することができました. ありがとうございました. 次は,表示した画像をクリックして発生したイベント処理を したいと思っているので,またしばらく作りながら調べてみます. また書き込みをするかもしれませんが,その時は アドバイスいただければと思います. ありがとうございました. | ||||||||||||||||
|
投稿日時: 2008-04-09 10:35
書き忘れました。本題とは関係ありませんが、
コードで気になった点を1つ。 自分で生成した Brush は Dispose しなくてはなりません。
これだと、ここで生成された SolidBrush の Dispose を呼び出すことができなくなります。 通常はいったん変数に入れて、以下のように Dispose するか
あるいは、Using を使います。
ですが、青色の SolidBrush なら、システム定義のオブジェクトが Brushes クラスに用意されているので、それを使う方がよいでしょう。 これは Dispose する必要がありません。(というかしてはいけない)
| ||||||||||||||||
|
投稿日時: 2008-04-13 23:55
テッテさん.
返信が遅くなってしまい,すみませんでした. アドバイスありがとうございます. BrushってDisposeしなくちゃいけないんですね. 知りませんでした.. まだまだVB初心者で,わからないだらけですので そういった点もアドバイス頂けて助かりました. 本当にありがとうございます. |
1