VB6.0用掲示板の過去のログ(No.1)−VBレスキュー(花ちゃん)
[記事リスト] [新規投稿] [新着記事] [ワード検索] [過去ログ] [管理用]

投稿日: 2003/05/22(Thu) 17:29
投稿者Say
Eメール
URL
タイトルRe: 表示の拡大縮小について

> それだと、1/4倍したPictureBoxに対しての描画はなんら問題ないかも知れないですが、
> その1/4倍した画像を2倍、4倍していくと、その画像は段だん劣化していっちゃいますよね?

?
ピクセルの整数倍は原理的に劣化はありません。

> だから、拡大や縮小を行ったPictureBoxに対しては描画は行っても
> 意味のないことになりますよね?

それは個人の価値観の問題です。

> おそらく、拡大縮小を行っただけで画像がきたなくなる
> ペイントなんで誰も使いたくないですもの。。。

原理的に拡大縮小は劣化を伴います。
劣化しないのは、ピクセルを整数倍に拡大し、
同じ倍率で縮小した場合のみです。
ただし、拡大画面に変更を加えるとき、変更の加え方が
元画面のピクセルの整数倍単位でなかった場合、縮小したときに劣化します。


拡大画面つきペイントのようなソフトを作ろうとしているのではありませんか?
描画が発生するたびにStretchBltで画像転送しまくっていたら遅くなるのは当然です。

画像読み込みのときはともかく、画像編集処理はライン描画やフィルタ処理などになるのではありませんか?
それならば、両方のPictureBoxに描画すればいいだけではないでしょうか?
たとえば、自由曲線の場合こんな感じ。
(手抜きですから縮小画面のほうがちょっとだけ劣化します。それがいやなら、
ブレセンハムのアルゴリズムなど用いて、Lineルーチンを自作する必要があります。)

Option Explicit
Dim x_bai As Long
Dim y_bai As Long
Dim x0 As Single
Dim y0 As Single

Dim lngDrawFlg1 As Long
Dim lngDrawFlg2 As Long
Private Sub Form_Load()
    Picture1.AutoRedraw = True
    Picture2.AutoRedraw = True
    Picture1.ScaleMode = vbPixels
    Picture2.ScaleMode = vbPixels
    x_bai = 2
    y_bai = 2
    Picture2.Width = Picture1.Width * x_bai
    Picture2.Height = Picture1.Height * y_bai
    lngDrawFlg1 = 0
    lngDrawFlg2 = 0
End Sub

Private Sub Picture1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
    lngDrawFlg1 = 1
    x0 = X
    y0 = Y
End Sub

Private Sub Picture1_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
    Dim x1 As Single
    Dim y1 As Single
    Dim x2 As Single
    Dim y2 As Single
    Dim x3 As Single
    Dim y3 As Single
    If lngDrawFlg1 = 1 Then
        x1 = X
        y1 = Y
        x2 = x0 * x_bai
        y2 = y0 * y_bai
        x3 = x1 * x_bai
        y3 = y1 * y_bai
        Picture2.Line (x2, y2)-(x3, y3)
        Picture2.Line (x2 + 1, y2)-(x3 + 1, y3)
        Picture2.Line (x2, y2 + 1)-(x3, y3 + 1)
        Picture2.Line (x2 + 1, y2 + 1)-(x3 + 1, y3 + 1)
        Picture1.Line (x0, y0)-(x1, y1)
        x0 = x1
        y0 = y1
    End If
End Sub

Private Sub Picture1_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)
    lngDrawFlg1 = 0
End Sub

Private Sub Picture2_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
    lngDrawFlg2 = 1
    x0 = X \ x_bai
    y0 = Y \ y_bai
End Sub

Private Sub Picture2_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
    Dim x1 As Single
    Dim y1 As Single
    Dim x2 As Single
    Dim y2 As Single
    Dim x3 As Single
    Dim y3 As Single
    If lngDrawFlg2 = 1 Then
        x1 = X \ x_bai
        y1 = Y \ y_bai
        x2 = x0 * x_bai
        y2 = y0 * y_bai
        x3 = x1 * x_bai
        y3 = y1 * y_bai
        Picture2.Line (x2, y2)-(x3, y3)
        Picture2.Line (x2 + 1, y2)-(x3 + 1, y3)
        Picture2.Line (x2, y2 + 1)-(x3, y3 + 1)
        Picture2.Line (x2 + 1, y2 + 1)-(x3 + 1, y3 + 1)
        Picture1.Line (x0, y0)-(x1, y1)
        x0 = x1
        y0 = y1
    End If
End Sub

Private Sub Picture2_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)
    lngDrawFlg2 = 0
End Sub


- 関連一覧ツリー (★ をクリックするとツリー全体を一括表示します)

- 返信フォーム (この記事に返信する場合は下記フォームから投稿して下さい)

- Web Forum -