tagCANDY CGI VBレスキュー(花ちゃん)の Visual Basic 6.0用 掲示板 [ツリー表示へ]   [Home]
一括表示(VB6.0)
タイトルImage動的に配置
記事No14582
投稿日: 2010/04/01(Thu) 17:05
投稿者CC
いつもお世話になっています。ccです。

質問:
いつもツルバーから、Imageを選択して、Frame上で配置していますが、
今回、アルバムを作りたいのですが。
Imageの数が不定なので、
写真の数によりますが、最大約300ぐらいがあります。
一気にImageBoxに表示したい。
プログラム上でどう書けばいいでしょうか。

以上、よろしくお願いします。

[ツリー表示へ]
タイトルRe: Image動的に配置
記事No14583
投稿日: 2010/04/01(Thu) 19:53
投稿者魔界の仮面弁士
> 一気にImageBoxに表示したい。
ImageBox というのは、イメージ (Image) コントロールのことで良いでしょうか?
それとも、PictureBox の方でしょうか?


> Image動的に配置
> Imageの数が不定なので
「コントロール配列」にすれば、Load / Unload ステートメントを使って
コントロール数を動的に増減させることができます。


Option Explicit

Private Sub Form_Load()
    Image1(0).Move 0, 0
    Set Image1(0).Picture = Me.Icon
    Command1.Caption = "増"
    Command2.Caption = "減"
    Command2.Enabled = False
End Sub

'画像を増やす
Private Sub Command1_Click()
    Command2.Enabled = True
    Dim i As Integer
    i = Image1.UBound + 1
    Load Image1(i)
    Set Image1(i).Picture = Me.Icon '←(実際には LoadPicture 等を利用)
    With Image1(i - 1)
        Image1(i).Move .Left, .Top + .Height
    End With
    Image1(i).Visible = True
End Sub

'画像を減らす
Private Sub Command2_Click()
    Dim i As Integer
    i = Image1.UBound
    If i = 0 Then
        Command2.Enabled = False
    Else
        Unload Image1(i)
    End If
End Sub


> 写真の数によりますが、最大約300ぐらいがあります。
ひとつひとつの画像サイズは、幾つぐらいでしょう?

仮に、一つの画像が 64 x 64 という小さい写真だったとして、
それを 1280 x 1024 のデスクトップに隙間なく並べると、
計 320 個になりますね。

もしもそれを超える画像サイズであれば、一度に画面に表示できる写真の数は
もっと少ないと思いますので、「見えている範囲分のみ Image を用意」することで、
必要なコントロール数を、もっと減らせるかもしれません。

[ツリー表示へ]
タイトルRe^2: Image動的に配置
記事No14584
投稿日: 2010/04/02(Fri) 09:25
投稿者CC
魔界の仮面弁士さん、ご回答ありがとう。

> ImageBox というのは、イメージ (Image) コントロールのことで良いでしょうか?
> それとも、PictureBox の方でしょうか?
Imageコントロールです、すみません

> Option Explicit
>
> Private Sub Form_Load()
>     Image1(0).Move 0, 0
>     Set Image1(0).Picture = Me.Icon
サンプル中に、Image1(0)の宣言がどうなっているのでしょうか。

> > 写真の数によりますが、最大約300ぐらいがあります。
> ひとつひとつの画像サイズは、幾つぐらいでしょう?
主にデジ写真ですが、1160*1131ぐらいです。
約5〜7MBぐらい。

> 仮に、一つの画像が 64 x 64 という小さい写真だったとして、
> それを 1280 x 1024 のデスクトップに隙間なく並べると、
> 計 320 個になりますね。
1280 x 1024がどういう意味ですか。

(1280 x 1024)/(1160*1131)=0.99枚
ありえないでしょうね。

やることは
VIXようなアルバムことです。
まず、一覧の表示。

よろしくお願いします。

[ツリー表示へ]
タイトルRe^3: Image動的に配置
記事No14585
投稿日: 2010/04/02(Fri) 09:56
投稿者魔界の仮面弁士
CCさんの日本語というか、助詞の使い方に違和感を覚えますが、それは横に置いといて…。

> サンプル中に、Image1(0)の宣言がどうなっているのでしょうか。
Image コントロールをフォームに貼り、その名前を "Image1" にしておきます。
さらに、デザイナ上から Index プロパティを 0 に設定しておけば OK です。

> 約5〜7MBぐらい。
であれば、300 個の Image コントロールに読み込ませる事が現実的ではない事は分かりますよね。

画面上には、せいぜいひとつの写真しか同時に表示できないにもかかわらず、300 個のコントロールに
それぞれの写真を読み込ませたら、単純計算でも 約1.5GB のメモリが消費される計算になるわけです。

また、Image コントロールに縮小表示させるにしても、各画像のファイル全体を
ロードしなければならない事には変わりありません。jpg 写真には、縮小画像情報(サムネイル)を
含むものもありますが、VB6 の標準機能にはそこだけを読み取る手段は用意されていないため、
結局は、画像データをすべて読み込んだ上で縮小される事になります。


> 1280 x 1024がどういう意味ですか。
SXGA の意味です。
http://ja.wikipedia.org/wiki/%E7%94%BB%E9%9D%A2%E8%A7%A3%E5%83%8F%E5%BA%A6


> VIXようなアルバムことです。
…"VIXの様な"? それとも"VIX用"の意味?

VIX という言葉は初耳なのですが、それは何でしょうか?
google で調べたところ、(VIX ではなく) ViX というソフトならありましたが…別物?

[ツリー表示へ]
タイトルRe^4: Image動的に配置
記事No14586
投稿日: 2010/04/02(Fri) 10:48
投稿者CC
魔界の仮面弁士さん、ご回答ありがとう。

> CCさんの日本語というか、助詞の使い方に違和感を覚えますが、それは横に置いといて…。
いつもお世話になっています。

> > サンプル中に、Image1(0)の宣言がどうなっているのでしょうか。
> Image コントロールをフォームに貼り、その名前を "Image1" にしておきます。
> さらに、デザイナ上から Index プロパティを 0 に設定しておけば OK です。
>
なるほど。
以前、やったことがないので、初歩の質問すみませんでした。

> > 約5〜7MBぐらい。
> であれば、300 個の Image コントロールに読み込ませる事が現実的ではない事は分かりますよね。
> 。。。
> 結局は、画像データをすべて読み込んだ上で縮小される事になります。
私が勘違いかもしれないですが、
Vixの場合、或いはPMBの場合、
一覧図の表示どうなっているのでしょうか。

> SXGA の意味です。
なるほど。

> google で調べたところ、(VIX ではなく) ViX というソフトならありましたが…別物?
ViXです。

よろしくお願いします。

[ツリー表示へ]
タイトルRe^5: Image動的に配置
記事No14592
投稿日: 2010/04/02(Fri) 21:30
投稿者魔界の仮面弁士
> 私が勘違いかもしれないですが、
勘違いとは、何に対してでしょうか?


> Vixの場合、或いはPMBの場合、
> 一覧図の表示どうなっているのでしょうか。
流石に、細かい実装については作った人でないと分かりませんので、
実際の動作や使用しているライブラリなどから、御自身で判断してみてください。

なお ViX では、高速化のために読み込んだ画像情報を .VIX ファイルとして
キャッシュしているようですね。


とりあえず、手抜き実装の縮小表示サンプルを挙げておきます。
処理速度等は無視して、VB6 の標準機能のみで実装しています。

Option Explicit

'画像のあるフォルダ
Private Const folder As String = "C:\Sample\Pictures\"

'表示する画像の数
Private Const ColumnCount As Long = 4
Private Const RowCount As Long = 4

Private Sub Form_Resize()
    Refresh
End Sub

Private Sub Form_Paint()
    ScaleHeight = RowCount
    ScaleWidth = ColumnCount
    Dim s As String
    s = Dir(folder & "*.jpg")
    If s = "" Then
        Print "画像がありません。"
        Exit Sub
    End If
    Dim x As Long, y As Long
    For y = 0 To RowCount - 1
        For x = 0 To ColumnCount - 1
            If s = "" Then
                Exit Sub
            End If
            Dim p As Picture
            Set p = LoadPicture(folder & s)
            PaintPicture p, x, y, 1, 1
            CurrentX = x
            CurrentY = y
            Print s
            s = Dir()
        Next
    Next
End Sub

[ツリー表示へ]
タイトルRe^6: Image動的に配置
記事No14594
投稿日: 2010/04/05(Mon) 10:19
投稿者CC
魔界の仮面弁士さん、ご回答ありがとう。

> > 私が勘違いかもしれないですが、
> 勘違いとは、何に対してでしょうか?
知識が不足ですが、
Imageコントロールを並べて配置していると思っています。

> なお ViX では、高速化のために読み込んだ画像情報を .VIX ファイルとして
> キャッシュしているようですね。
このについて、次回の質問をします。よろしく。

サンプルありがとう。
通常はそうですね。Pictureコントロールを使った表示すること。

今回の質問、回答していただき、ありがとうございました。

[ツリー表示へ]
タイトルRe^7: Image動的に配置
記事No14595
投稿日: 2010/04/05(Mon) 10:38
投稿者魔界の仮面弁士
> 知識が不足ですが、
> Imageコントロールを並べて配置していると思っています。
そもそも ViX は Visual Basic 6.0 で作成されたものではなく、
Visual C++ 6.0 製です。開発環境が異なるわけですから、使用できる
ライブラリやアルゴリズムにも当然差異が生じて然る可きかと。

> 通常はそうですね。Pictureコントロールを使った表示すること。
ちなみに先のサンプルでは、Picture コントロールや Image コントロールは
使用せずに、フォームに直接描画するようにしています。

[ツリー表示へ]
タイトルRe^8: Image動的に配置
記事No14596
投稿日: 2010/04/05(Mon) 13:24
投稿者CC
魔界の仮面弁士さん、ご回答ありがとう。

> そもそも ViX は Visual Basic 6.0 で作成されたものではなく、
> Visual C++ 6.0 製です。開発環境が異なるわけですから、使用できる
> ライブラリやアルゴリズムにも当然差異が生じて然る可きかと。
そうですか。
このについて、次回の質問をします。よろしくお願いします。

> > 通常はそうですね。Pictureコントロールを使った表示すること。
> ちなみに先のサンプルでは、Picture コントロールや Image コントロールは
> 使用せずに、フォームに直接描画するようにしています。
わかっています、通常、私の場合Picture コントロールを使って、
画像を表示しています。

今回の回答ありがとうございました。

[ツリー表示へ]