投稿日 | : 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