投稿時間: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
|