C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[21]: VB


(過去ログ 99 を表示中)

[トピック内 23 記事 (1 - 20 表示)]  << 0 | 1 >>

■58607 / inTopicNo.1)  VB
  
□投稿者/ ダメなネコさん (7回)-(2011/04/18(Mon) 13:09:03)

分類:[.NET 全般] 






Public Class Form1

'線を消して再び画像を表示させるため
Dim sImgPath As String

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

Dim h, w As Integer
'ディスプレイの作業領域の高さ()
h = System.Windows.Forms.Screen.GetWorkingArea(Me).Height
'ディスプレイの作業領域の幅
w = System.Windows.Forms.Screen.GetWorkingArea(Me).Width

Me.Width = w
Me.Height = h

'ピクチャーボックスの大きさ
PictureBox1.Width = w - 100
PictureBox1.Height = h - 100

'縦長はサイズをアレンジして、いっぱいで画面に入る
PictureBox1.SizeMode = PictureBoxSizeMode.Zoom

'不恰好だけど、ちゃんと画面に入る(使用不可)
'PictureBox1.SizeMode = PictureBoxSizeMode.StretchImage

End Sub


Private Sub picturebox1_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseMove


Dim img As Image = PictureBox1.Image
Dim g As Graphics = PictureBox1.CreateGraphics


'このIF文があると線が引けなくなる(わからない・・・)

'If PictureBox1.Image Is Nothing Then
'Else
' g = Graphics.FromImage(PictureBox1.Image)
'End If


If e.Button = MouseButtons.Left Then

g.FillEllipse(Brushes.Red, e.X, e.Y, 10, 10)


ElseIf e.Button = MouseButtons.Right Then

g.FillEllipse(Brushes.Blue, e.X, e.Y, 10, 10)

End If

End Sub

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

'登録する

Dim hiritu
Dim hirituh
Dim penw As Integer
Dim penh As Integer
Dim img As Image = PictureBox1.Image


Dim sImgFile As String


' ' Year関数できょうの西暦年号を取得
Dim seireki As Integer = Year(Now)

' ' Month関数できょうの月を取得
Dim tsuki As Integer = Month(Now)

' ' day関数できょうの日を取得
Dim hi As Integer = _
Microsoft.VisualBasic.DateAndTime.Day(Now)

' ' Hour関数で現在の時を取得
Dim ji As Integer = Hour(Now)

' ' Minute関数で現在の分を取得
Dim hun As Integer = Minute(Now)

' ' Second関数で現在の秒を取得
Dim byou As Integer = Second(Now)

Dim fnt As New Font("MS ゴシック", 10)


hiritu = PictureBox1.Width / img.Width
hirituh = PictureBox1.Height / img.Height
penw = 3 / hiritu * 10
penh = 3 / hirituh * 10


If img.Width > img.Height Then

If img.Width > 2000 Then
fnt = New Font("MS ゴシック", 48)
ElseIf img.Width > 1500 Then
fnt = New Font("MS ゴシック", 36)
ElseIf img.Width > 1000 Then
fnt = New Font("MS ゴシック", 24)
ElseIf img.Width > 500 Then
fnt = New Font("MS ゴシック", 12)
ElseIf img.Width > 0 Then
fnt = New Font("MS ゴシック", 10)
End If
End If

If img.Width = img.Height Then

If img.Width > 2000 Then
fnt = New Font("MS ゴシック", 48)
ElseIf img.Width > 1500 Then
fnt = New Font("MS ゴシック", 36)
ElseIf img.Width > 1000 Then
fnt = New Font("MS ゴシック", 28)
ElseIf img.Width > 500 Then
fnt = New Font("MS ゴシック", 12)
ElseIf img.Width > 0 Then
fnt = New Font("MS ゴシック", 10)
End If
End If

If img.Width < img.Height Then
If img.Height > 2000 Then
fnt = New Font("MS ゴシック", 48)
ElseIf img.Height > 1500 Then
fnt = New Font("MS ゴシック", 36)
ElseIf img.Height > 1000 Then
fnt = New Font("MS ゴシック", 24)
ElseIf img.Height > 500 Then
fnt = New Font("MS ゴシック", 12)
ElseIf img.Width > 0 Then
fnt = New Font("MS ゴシック", 10)
End If
End If

Dim z As Graphics

z = Graphics.FromImage(PictureBox1.Image)


z.DrawString(seireki & "年" & tsuki & "月" & hi & "日" & ji & "時" & hun & "分", fnt, Brushes.Blue, 0, 0)


'PictureBox1.Image.Save("\\192.168.1.11\My Documents\登録画像\IMG_登録.JPG", System.Drawing.Imaging.ImageFormat.Jpeg)
PictureBox1.Image.Save("C:\Documents and Settings\main\デスクトップ\完成してくれ.JPG", System.Drawing.Imaging.ImageFormat.Jpeg)


''sImgFile = "\\192.168.1.11\My Documents\登録画像\IMG_登録.JPG"
sImgFile = "C:\Documents and Settings\main\デスクトップ\完成してくれ.JPG"
''sImgFile = "\\192.168.1.11\デスクトップ\IMG_登録.JPG"

If System.IO.File.Exists(sImgFile) Then
System.IO.File.Delete(sImgFile)
End If

PictureBox1.Image.Save(sImgFile, System.Drawing.Imaging.ImageFormat.Jpeg)


'クリアーする()
Me.PictureBox1.Image.Dispose()
End


End
End Sub



Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
Dim ofd As New OpenFileDialog


With ofd
'タイトル
.Title = "開くファイルを選択してください"
'初期のファイル名
.FileName = ""
'フィルターの何番目を既定値にするか
.FilterIndex = 1
'フィルター:ファイルの種類
.Filter = "画像ファイル名(*.BMP;*.JPG;*.GIF)|*.BMP;*.JPG;*.GIF"
'初期のフォルダー
.InitialDirectory = "C:\Documents and Settings\main\デスクトップ\"
End With

'「ファイルを開く」ダイアログを表示。
If ofd.ShowDialog() = DialogResult.OK Then
'選択されたファイルをピクチャーボックスに表示
sImgPath = ofd.FileName
'sImgFile = ofd.SafeFileName
PictureBox1.Image = Image.FromFile(sImgPath)
PictureBox1.ImageLocation = sImgPath
'PictureBox1.BorderStyle = BorderStyle.Fixed3D
PictureBox1.BorderStyle = BorderStyle.None
End If

ofd.Dispose()
End Sub

Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click

'クリアー処理
'PictureBox内の表示を消去する
PictureBox1.Image = Nothing

'上記でもいいが下記の方法が MSDN でも紹介されています。
'最初にイメージによって使用されているメモリを解放してから、グラフィックを消去します
With PictureBox1
If Not (.Image Is Nothing) Then
.Image.Dispose()
.Image = Nothing
End If
End With

'線だけを消して画像を表示させる
PictureBox1.Image = Image.FromFile(sImgPath)

End Sub
End Class
引用返信 編集キー/
■58610 / inTopicNo.2)  Re[1]: VB
□投稿者/ ダメなネコさん (8回)-(2011/04/18(Mon) 13:19:13)
質問の内容を書こうと思ったのですが・・・

プログラムだけで、間違って送信してしまいました・・・

困りました・・・。

過去ログもそうなのですが、削除ってどうすれば出来るのでしょうか?・・・

そして・・・

以前、VBで線画すること、で質問した者なのですが・・・

VBで画像を呼び出して、呼び出した画像に、マウスを使って線画します。
線画した画像を保存したいのですが、線は引けても線は保存されないのです。

どうしたらよいのでしょうか ??

久しぶりにVBをしているのですが、素人以下なので
こんな「ダメなネコさん」にでも理解るようアドバイスほしいのですが・・・

読んでくださった方々、ありがとうございました。

VBって難しくて困ります・・・


引用返信 編集キー/
■58611 / inTopicNo.3)  Re[1]: VB
□投稿者/ shu (627回)-(2011/04/18(Mon) 13:22:26)
No58607 (ダメなネコさん さん) に返信

> 'このIF文があると線が引けなくなる(わからない・・・)
>
> 'If PictureBox1.Image Is Nothing Then
> 'Else
> ' g = Graphics.FromImage(PictureBox1.Image)
> 'End If
長くてソースしかないのでこれしか見当たらなかったのですがこれが質問内容ですか?
Imageから取得したGraphicsに描画した場合、PictureBox1.Refreshとか必要です。

引用返信 編集キー/
■58615 / inTopicNo.4)  Re[2]: VB
□投稿者/ shu (629回)-(2011/04/18(Mon) 13:45:10)
No58610 (ダメなネコさん さん) に返信

書き込みが前後しました。


> VBで画像を呼び出して、呼び出した画像に、マウスを使って線画します。
> 線画した画像を保存したいのですが、線は引けても線は保存されないのです。
ImageにSaveメソッドがあるので、保存したいタイミングで呼ぶとよいです。

例)PictureBox1.Image.Save("C:\temp\abc.bmp",ImageFormat.bmp)
引用返信 編集キー/
■58618 / inTopicNo.5)  Re[3]: VB
□投稿者/ ダメなネコさん (9回)-(2011/04/18(Mon) 14:12:38)
No58615 (shu さん) に返信
> ■No58610 (ダメなネコさん さん) に返信
>
> 書き込みが前後しました。
>
>
>>VBで画像を呼び出して、呼び出した画像に、マウスを使って線画します。
>>線画した画像を保存したいのですが、線は引けても線は保存されないのです。
> ImageにSaveメソッドがあるので、保存したいタイミングで呼ぶとよいです。
>
> 例)PictureBox1.Image.Save("C:\temp\abc.bmp",ImageFormat.bmp)

shuさん、ありがとうございます。

登録(保存した場所)の場所にSaveしているのですが・・・
線が消えて保存されてしまいます。
困ってしまいます・・・
引用返信 編集キー/
■58620 / inTopicNo.6)  Re[4]: VB
□投稿者/ shu (630回)-(2011/04/18(Mon) 14:26:00)
No58618 (ダメなネコさん さん) に返信


> 登録(保存した場所)の場所にSaveしているのですが・・・
> 線が消えて保存されてしまいます。
> 困ってしまいます・・・
No58611の部分が直されていないからかもしれません。
PictureBox1.CreateGraphicsで描画するとImageの方には
かかれないのでg = Graphics.FromImage(PictureBox1.Image)
の方で描画しRefreshしないとPictureBox1.Imageには反映されません。

引用返信 編集キー/
■58621 / inTopicNo.7)  Re[5]: VB
□投稿者/ ダメなネコさん (10回)-(2011/04/18(Mon) 15:14:38)
No58620 (shu さん) に返信
> ■No58618 (ダメなネコさん さん) に返信
>
>
>>登録(保存した場所)の場所にSaveしているのですが・・・
>>線が消えて保存されてしまいます。
>>困ってしまいます・・・
> No58611の部分が直されていないからかもしれません。
> PictureBox1.CreateGraphicsで描画するとImageの方には
> かかれないのでg = Graphics.FromImage(PictureBox1.Image)
> の方で描画しRefreshしないとPictureBox1.Imageには反映されません。

即答、ありがとうございます!!
shuさんのアドバイスで・・・

Private Sub picturebox1_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseMove

Dim img As Image = PictureBox1.Image

    「↓shuさんのアドバイス↓」
Dim g = Graphics.FromImage(PictureBox1.Image)

'このIF文があると線が引けなくなる(わからない・・・)
'If PictureBox1.Image Is Nothing Then
'Else
' g = Graphics.FromImage(PictureBox1.Image)
'End If

If e.Button = MouseButtons.Left Then
g.FillEllipse(Brushes.Red, e.X, e.Y, 10, 10)

ElseIf e.Button = MouseButtons.Right Then
g.FillEllipse(Brushes.Blue, e.X, e.Y, 10, 10)

End If

    「↓shuさんのアドバイス↓」
PictureBox1.Refresh()

End Sub

プログラムを組み実行すると・・・
マウスの位置に線画してくれなくなってしまいました。
困りました・・・


引用返信 編集キー/
■58622 / inTopicNo.8)  Re[6]: VB
□投稿者/ shu (631回)-(2011/04/18(Mon) 15:22:07)
No58621 (ダメなネコさん さん) に返信

> プログラムを組み実行すると・・・
> マウスの位置に線画してくれなくなってしまいました。
> 困りました・・・

それって過去ログに行ってしまった前回の内容では?
FillEllipseに渡す座標を変換しないと駄目ですよ。
引用返信 編集キー/
■58623 / inTopicNo.9)  Re[7]: VB
□投稿者/ ダメなネコさん (11回)-(2011/04/18(Mon) 15:38:44)
No58622 (shu さん) に返信
> ■No58621 (ダメなネコさん さん) に返信
>
>>プログラムを組み実行すると・・・
>>マウスの位置に線画してくれなくなってしまいました。
>>困りました・・・
>
> それって過去ログに行ってしまった前回の内容では?
> FillEllipseに渡す座標を変換しないと駄目ですよ。



shuさん、そうなんです。
座標の変換が全く理解出来なくて・・・



Private Sub picturebox1_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseMove

Dim img As Image = PictureBox1.Image

@・・・これはimageに入らない、線画がズレない。保存されない。
Dim g As Graphics = PictureBox1.CreateGraphics

A・・・これはimageに入る、線画がズレる。保存される。
'Dim g = Graphics.FromImage(PictureBox1.Image)



If e.Button = MouseButtons.Left Then
g.FillEllipse(Brushes.Red, e.X, e.Y, 10, 10)

ElseIf e.Button = MouseButtons.Right Then
g.FillEllipse(Brushes.Blue, e.X, e.Y, 10, 10)

End If
    
    A・・・リフレッシュの必要性
'PictureBox1.Refresh()

End Sub

素人以下の私には、どうしても座標が解らなく・・・
@の場合だと、座標が解らなくても線画は出来るので、こんなふうに・・・
Ashuさんの場合だと座標の問題が出て、1から10まで解らないのです・・・

困りました・・・
しかも、今週は後20分くらいしか出来ないという・・・

shuさん、いつもありがとう。
shuさん、いつもごめんなさい・・・

なんて言ったら良いのか・・・
引用返信 編集キー/
■58624 / inTopicNo.10)  Re[8]: VB
□投稿者/ shu (632回)-(2011/04/18(Mon) 16:10:46)
No58623 (ダメなネコさん さん) に返信

過去ログより(まさにこの部分と同じ処理の気がするのですが)
縦長、横長両対応

        Dim x As Integer
        Dim x2 As Integer
        Dim y As Integer
        Dim y2 As Integer

        ・・・・

        x2 = CInt((PictureBox1.Width - (img.Width * PictureBox1.Height / img.Height)) / 2)
        y2 = CInt((PictureBox1.Height - (img.Height * PictureBox1.Width / img.Width)) / 2)

        If x2 > 0 Then
            x = CInt((e.X - x2) * img.Height / PictureBox1.Height)
            y = CInt(e.Y * img.Height / PictureBox1.Height)
        Else
            x = CInt(e.X * img.Width / PictureBox1.Width)
            y = CInt((e.Y - y2) * img.Width / PictureBox1.Width)
        End If

        If e.Button = MouseButtons.Left Then
            g.FillEllipse(Brushes.Red, x, y, 10, 10)
        ElseIf e.Button = MouseButtons.Right Then
            g.FillEllipse(Brushes.Blue, x, y, 10, 10)
        End If


引用返信 編集キー/
■58669 / inTopicNo.11)  Re[9]: VB
□投稿者/ ダメなネコさん (12回)-(2011/04/21(Thu) 15:10:12)
No58624 (shu さん) に返信
> ■No58623 (ダメなネコさん さん) に返信
>
> 過去ログより(まさにこの部分と同じ処理の気がするのですが)
> 縦長、横長両対応
>
> Dim x As Integer
> Dim x2 As Integer
> Dim y As Integer
> Dim y2 As Integer
>
> ・・・・
>
> x2 = CInt((PictureBox1.Width - (img.Width * PictureBox1.Height / img.Height)) / 2)
> y2 = CInt((PictureBox1.Height - (img.Height * PictureBox1.Width / img.Width)) / 2)
>
> If x2 > 0 Then
> x = CInt((e.X - x2) * img.Height / PictureBox1.Height)
> y = CInt(e.Y * img.Height / PictureBox1.Height)
> Else
> x = CInt(e.X * img.Width / PictureBox1.Width)
> y = CInt((e.Y - y2) * img.Width / PictureBox1.Width)
> End If
>
> If e.Button = MouseButtons.Left Then
> g.FillEllipse(Brushes.Red, x, y, 10, 10)
> ElseIf e.Button = MouseButtons.Right Then
> g.FillEllipse(Brushes.Blue, x, y, 10, 10)
> End If
>
SHUさん、SHUさんのアドバイスをもとに
プログラムを修正しました。
↓↓

Private Sub picturebox1_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseMove


Dim x As Integer
Dim x2 As Integer
Dim y As Integer
Dim y2 As Integer
Dim img As Image = PictureBox1.Image

Dim g = Graphics.FromImage(PictureBox1.Image)


x2 = CInt((PictureBox1.Width - (img.Width * PictureBox1.Height / img.Height)) / 2)
y2 = CInt((PictureBox1.Height - (img.Height * PictureBox1.Width / img.Width)) / 2)

If x2 > 0 Then
x = CInt((e.X - x2) * img.Height / PictureBox1.Height)
y = CInt(e.Y * img.Height / PictureBox1.Height)
Else
x = CInt(e.X * img.Width / PictureBox1.Width)
y = CInt((e.Y - y2) * img.Width / PictureBox1.Width)
End If

If e.Button = MouseButtons.Left Then
g.FillEllipse(Brushes.Red, x, y, 10, 10)
ElseIf e.Button = MouseButtons.Right Then
g.FillEllipse(Brushes.Blue, x, y, 10, 10)
End If

PictureBox1.Refresh()

End Sub

今、テストを始めたばかりなのですが・・・
線画することが出来、線画した画像を登録することも出来ました。

長い道程だったので「奇跡が起きた気分」です。
ホットすると同時に、とっても嬉しいし、ラッキーです。

これから様々なテストをして・・・

プログラムを全然理解していないので
私なりに解析して
問題が起きないようだったら
解決済みチェックをしようと思います。


SHUさん、本当にありがとうございました。救われました!!!



引用返信 編集キー/
■59020 / inTopicNo.12)  Re[10]: VB
□投稿者/ ダメなネコさん (13回)-(2011/05/09(Mon) 14:29:46)

あれからプログラム上、何も問題は出ていません。
ありがたいことです。

↓のプログラムを解析しているのですが、
全く判らないのです。
とっても難しい式で・・・

今も解析中なのですが・・・

詳しく教えてほしいのですが・・・

無理でしょうか・・・


>> x2 = CInt((PictureBox1.Width - (img.Width * PictureBox1.Height / img.Height)) / 2)
>> y2 = CInt((PictureBox1.Height - (img.Height * PictureBox1.Width / img.Width)) / 2)
>>
>> If x2 > 0 Then
>> x = CInt((e.X - x2) * img.Height / PictureBox1.Height)
>> y = CInt(e.Y * img.Height / PictureBox1.Height)
>> Else
>> x = CInt(e.X * img.Width / PictureBox1.Width)
>> y = CInt((e.Y - y2) * img.Width / PictureBox1.Width)
>> End If
>>

引用返信 編集キー/
■59021 / inTopicNo.13)  Re[11]: VB
□投稿者/ shu (677回)-(2011/05/09(Mon) 14:56:56)
No59020 (ダメなネコさん さん) に返信

> >> x2 = CInt((PictureBox1.Width - (img.Width * PictureBox1.Height / img.Height)) / 2)
x2はPictureBox1へimgの内容をZoomで表示するとき縦の比率を優先した場合に表示された画像がPictureBoxの
左からどこの位置に表示されるかを表しています。


> >> y2 = CInt((PictureBox1.Height - (img.Height * PictureBox1.Width / img.Width)) / 2)
y2はPictureBox1へimgの内容をZoomで表示するとき横の比率を優先した場合に表示された画像がPictureBoxの
上からどこの位置に表示されるかを表しています。


> >> If x2 > 0 Then
x2>0ということは縦の比率を優先した方がZoomした画像がPictureBox1内に収まるということになります。

> >> x = CInt((e.X - x2) * img.Height / PictureBox1.Height)
> >> y = CInt(e.Y * img.Height / PictureBox1.Height)
縦の比率を優先しているのでピクチャーボックス内の左端にシフトした座標は高さの比率で元の画像の座標に
対応つけることが出来ます。

> >> Else
x2<=0ということは横の比率を優先した方がZoomした画像がPictureBox1内に収まるということになります。

> >> x = CInt(e.X * img.Width / PictureBox1.Width)
> >> y = CInt((e.Y - y2) * img.Width / PictureBox1.Width)
横の比率を優先しているのでピクチャーボックス内の上端にシフトした座標は幅の比率で元の画像の座標に
対応つけることが出来ます。


> >> End If


imgの幅:Pic画像の幅 = imgの高:Pic画像の高

という関係を保つのがZoomなので

例えば Pic画像の幅 = imgの幅 * Pic画像の高 / imgの高
となります(これは比の計算なので分かりますか?)

Pic画像の幅、高は実際にはPictureBox1の幅か高になります。(Zoom指定の為)
どちらが一致しているかわからないのでx2,y2を求め高さの比率にした方が
よいのか幅の比率にした方がよいのか判断しています。



引用返信 編集キー/
■59022 / inTopicNo.14)  Re[12]: VB
□投稿者/ ダメなネコさん (14回)-(2011/05/09(Mon) 15:11:35)
shuさん、いつもありがとうございます。

しかも、即答で、重ね重ね、ありがとうございます。

丁寧に記述してくれて助かります。

これから、時間は「とても長くかかります」が・・・

じっくり、解析します。

ありがとうございます!!


引用返信 編集キー/
■59093 / inTopicNo.15)  Re[13]: VB
□投稿者/ ダメなネコさん (15回)-(2011/05/12(Thu) 15:05:28)
こんにちは、またVBの時間を持つことが出来ました。

例えばIMG.WIDTH 1200, IMG.HEIGHT 900 の画像で検討しようと思います。
PICTUREBOX1.WIDTH 924, PICTUREBOX1.HEIGHT 638 に入れます。

x2 = CInt((PictureBox1.Width - (img.Width * PictureBox1.Height / img.Height)) / 2)

CINT...これは四捨五入ですよね。

x2はPictureBox1へimgの内容をZoomで表示するとき
縦の比率を優先した場合に表示された画像がPictureBoxの左からどこの位置に表示されるかを表しています。(左からどこの位置って何ですか??)

PICTUREBOX1.HEIGHT / IMG.HEIGHT...これは縦が何倍になったかですよね??

IMG.WIDTH * PICTUREBOX1.HEIGHT / IMG.HEIGHT...@
縦の倍率に合わせた横のPICTUREBOX1.WIDTHだったら、ということですか??

x2 = CInt((PictureBox1.Width - @) / 2)
PICTUREBOX1.WIDTH924 と 縦の倍率で求めた横 を 引いている???
どうしてでしょうか?
最後に、引いたものを2で割っているのですが
どうしてでしょうか?

とても難しくて・・・

解読できる方、助けてほしいのですが・・・






引用返信 編集キー/
■59096 / inTopicNo.16)  Re[14]: VB
□投稿者/ shu (686回)-(2011/05/12(Thu) 15:46:39)
No59093 (ダメなネコさん さん) に返信

> CINT...これは四捨五入ですよね。
厳密には違いますが、小数点以下の端数処理程度に考えてください。
PictureBoxの座標は整数値しか扱わないのでこうしてます。


> x2はPictureBox1へimgの内容をZoomで表示するとき
> 縦の比率を優先した場合に表示された画像がPictureBoxの左からどこの位置に表示されるかを表しています。(左からどこの位置って何ですか??)
過去ログの人と同じ人ですよね?PictureBoxがImgより横広だとズームしたときに左右に余白が発生します。
その左側の余白の大きさの事です。16:9のテレビに4:3の古い番組が表示されるとき左右に余白が
出来るあれと同じだと思ってください。


> PICTUREBOX1.HEIGHT / IMG.HEIGHT...これは縦が何倍になったかですよね??
その通りです。ただしピクチャーボックスの中に表示される画像の高さがピクチャーボックスの高さと
一致しているという前提があります。


> IMG.WIDTH * PICTUREBOX1.HEIGHT / IMG.HEIGHT...@
> 縦の倍率に合わせた横のPICTUREBOX1.WIDTHだったら、ということですか??
縦の倍率に合わせて画像の幅を拡大、縮小した幅になります。Zoomなので高さも幅も同じ倍率で
拡大、縮小されるから。


> x2 = CInt((PictureBox1.Width - @) / 2)
> PICTUREBOX1.WIDTH924 と 縦の倍率で求めた横 を 引いている???
> どうしてでしょうか?
> 最後に、引いたものを2で割っているのですが
> どうしてでしょうか?
Zoomしたときに画像はピクチャーボックスの中央に表示されるので
ピクチャーボックスの幅 = 左余白 + 拡大縮小した幅 + 右余白
=> ピクチャーボックスの幅 - 拡大縮小した幅 = 左余白 + 右余白
となり左余白と右余白は同じなので2で割ります。
この左余白がマイナスになるということは縦の倍率だとはみだしてしまう
ということになるので横の倍率で計算しなければいけないということになります。



引用返信 編集キー/
■59097 / inTopicNo.17)  Re[15]: VB
□投稿者/ ダメなネコさん (16回)-(2011/05/12(Thu) 15:50:13)
SHUさん、いつもありがとうございます!!

送ってくれた文章を解析するのに時間(何日も)がかかりますが

これからじっくり検討します。

ありがとうございます!!
引用返信 編集キー/
■59226 / inTopicNo.18)  Re[16]: VB
□投稿者/ ダメなネコさん (17回)-(2011/05/19(Thu) 15:35:09)
shuさん、こんにちは!
考えて見たのですが・・・すみません。

CINT...これは四捨五入ですよね。
厳密には違いますが、小数点以下の端数処理程度に考えてください。
PictureBoxの座標は整数値しか扱わないのでこうしてます
・・・これは、良くわかりました!!!


x2はPictureBox1へimgの内容をZoomで表示するとき
縦の比率を優先した場合に表示された画像がPictureBoxの左からどこの位置に表示されるかを表しています。(左からどこの位置って何ですか??)
過去ログの人と同じ人ですよね?
・・・はい、同じひとです。

PictureBoxがImgより横広だとズームしたときに左右に余白が発生します。
その左側の余白の大きさの事です。16:9のテレビに4:3の古い番組が表示されるとき左右に余白が
出来るあれと同じだと思ってください。
・・・余白が出るんですね、知りませんでした、わかりました。


PICTUREBOX1.HEIGHT / IMG.HEIGHT...これは縦が何倍になったかですよね??
その通りです。ただしピクチャーボックスの中に表示される画像の高さがピクチャーボックスの高さと
一致しているという前提があります。
・・・ここがわかりません。すみません。
@ピクチャーボックスの高さは638で固定して作っています。
Aピクチャーボックスの中に表示される画像(ズームで変化した画像ですよね?)
@とAのサイズの一致(638)ということですか?
それとも、これは縦のズームを使い、img.heightを縦ズームしてpicturebox1.heightを表示させた
たということが「一致」ということですか??
・・・謎です。


IMG.WIDTH * PICTUREBOX1.HEIGHT / IMG.HEIGHT...@
縦の倍率に合わせた横のPICTUREBOX1.WIDTHだったら、ということですか??
縦の倍率に合わせて画像の幅を拡大、縮小した幅になります。Zoomなので高さも幅も同じ倍率で
拡大、縮小されるから。
・・・縦を使った倍率、つまり縦が2倍なら横も2倍っていうことですか??
間違っていたら、ごめんなさい。


x2 = CInt((PictureBox1.Width - @) / 2)
PICTUREBOX1.WIDTH924 と 縦の倍率で求めた横 を 引いている???
どうしてでしょうか?
最後に、引いたものを2で割っているのですが
どうしてでしょうか?


Zoomしたときに画像はピクチャーボックスの中央に表示されるので・・・
ここは、先ほどの説明でわかりました。うれしいです。

ピクチャーボックスの幅 = 左余白 + 拡大縮小した幅 + 右余白
・・・わかりました。

ピクチャーボックスの幅 - 拡大縮小した幅 = 左余白 + 右余白
・・・わかりました。

となり左余白と右余白は同じなので2で割ります。
・・・余白が同じなのはわかります、同じものが2つ、2で割る・・・???
・・・わかりません。

この左余白がマイナスになるということは縦の倍率だとはみだしてしまう
ということになるので横の倍率で計算しなければいけないということになります。
・・・横ズームだと、左右の余白がなくて、マイナスになるということですか??

X2、Y2で・・・(この値って????)
e.xと、e.yは、マウスで動かした矢印の場所ですよね?)
xがゼロ以上なら縦ズームをもとに座標を求めること?
マイナスならY、横ズームをもとに座標を求めること?

If x2 > 0 Then・・・縦で求める
 x = CInt((e.X - x2) * img.Height / PictureBox1.Height)・・・(e.X - x2)???これに倍率をかける・・・??
 y = CInt(e.Y * img.Height / PictureBox1.Height)・・・縦の倍率だから、その倍率にe.yをかける・・・??
Else・・・横で求める
 x = CInt(e.X * img.Width / PictureBox1.Width)・・・横の倍率だから、その倍率にe.xをかける・・・??
 y = CInt((e.Y - y2) * img.Width / PictureBox1.Width)・・・(e.Y - y2)???これに倍率をかける・・・??
End If

疑問が多すぎてすみません・・・

教えていただきたいのですが・・・

すみません・・・
引用返信 編集キー/
■59228 / inTopicNo.19)  Re[17]: VB
□投稿者/ shu (700回)-(2011/05/19(Thu) 15:59:01)
2011/05/19(Thu) 16:03:44 編集(投稿者)
No59226 (ダメなネコさん さん) に返信

元画像(12x6)
○○○○○○○○○○○○
○○○○○○○○○○○○
○○●●○○●●○○○○
○○●●○○●●○○○○
○○○○○○○○●●○○
○○○○○○○○●●○○


ピクチャーボックス(10x3,Zoom画像6x3 ,縦の3が一致)
□□○○○○○○□□
□□○●○●○○□□
□□○○○○●○□□

※□は余白(x2) 
※ 左余白 + 右余白 = ピクチャーボックスの幅(10)-ピクチャーボックスの画像の幅(6)
左余白 = 右余白
より10-6=4=左余白+右余白=2×左余白
左余白 = 2, 右余白 = 2


原点を合わせ余白を削除(e.X - x2) 
○○○○○○
○●○●○○
○○○○●○
※原点を一致させることにより対応する点はすべて倍率で求めることが出来る。
相似だから。


引用返信 編集キー/
■59230 / inTopicNo.20)  Re[18]: VB
 
□投稿者/ ダメなネコさん (18回)-(2011/05/19(Thu) 16:05:24)

shuさん、いつもありがとうございます。

時間がなくなってしまいました!!

じっくり、考えて、また、報告します。

いつもありがとうございます。
引用返信 編集キー/

次の20件>
トピック内ページ移動 / << 0 | 1 >>

管理者用

- Child Tree -