These are variables which I use for adjusting the picture into picture box and on resizing the form and these variables are also used in zooming function but not directly there!
This is the function which I pass it to the another function which is used to load picture in frmPic form first timeCode:Dim Auto_Size As Boolean = True Dim Shrink As Boolean = True Dim Enlarge As Boolean = True Dim ownerPnl As New Panel
This is for resizing the formCode:Private Sub DrawToScale(ByVal bmp As Image) On Error Resume Next pb.Image = New Bitmap(bmp) pb.SizeMode = PictureBoxSizeMode.Normal If Auto_Size Then Pic2Pic(pb, Panel1, Enlarge, Shrink) 'pb=picturebox 'Panel1=panel1 End Sub
Code for Pic2Pic FunctionCode:Private Sub PopupForm_Resize(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Resize On Error Resume Next If Auto_Size Then Pic2Pic(pb, Panel1, Enlarge, Shrink) End Sub
Code for isBigger functionCode:Public Sub Pic2Pic(ByVal Pic As PictureBox, ByVal Pnl As Panel, Optional ByVal FitSmall As Boolean = True, Optional ByVal FitBig As Boolean = True, Optional ByVal Border_Size As Double = 0) If Pic.Image Is Nothing Then Exit Sub Dim Pos As New ImagePosition() If isBigger(Pic, Pnl, True) Then If FitBig Then Pos.SetPosition(Pnl, Pic) Else Pic.SizeMode = PictureBoxSizeMode.AutoSize Move2Center(Pic, Pnl) End If Else If FitSmall Then Pos.SetPosition(Pnl, Pic) Else Pic.SizeMode = PictureBoxSizeMode.AutoSize Move2Center(Pic, Pnl) End If End If 'add border If Border_Size > 1 Then Pic.Width /= Border_Size Pic.Height /= Border_Size Move2Center(Pic, Pnl) End If End Sub
Code for Move2Center. This function moves this picture in the centerCode:Public Function isBigger(ByVal pic As PictureBox, ByVal pnl As Panel, ByVal compare_Image As Boolean) As Boolean If compare_Image Then If pic.Image.Width > pnl.Width Or _ pic.Image.Height > pnl.Height Then Return True Else Return False End If Else If pic.Width > pnl.Width Or _ pic.Height > pnl.Height Then Return True Else Return False End If End If End Function
This is MovePicto function.Code:Public Sub Move2Center(ByVal Pic1 As Object, ByVal Pic2 As Object, Optional ByVal Inborder As Boolean = True) Dim NX, NY As Integer NX = (Pic2.Width - Pic1.Width) / 2 NY = (Pic2.Height - Pic1.Height) / 2 If Inborder Then If NX < 0 Then NX = 0 If NY < 0 Then NY = 0 End If Pic1.Left = NX Pic1.Top = NY End Sub
These are ZoomIn() and ZoomOut() functionsCode:Public Sub MovePicto(ByVal pic As PictureBox, ByVal newx As Single, ByVal newy As Single) If pic.Width > ownerPnl.Width Then If newx + pic.Width > ownerPnl.Width And newx < 0 Then pic.Left = newx Else If newx < 0 Then pic.Left = ownerPnl.Width - pic.Width Else pic.Left = 0 End If End If Else pic.Left = (ownerPnl.Width - pic.Width) / 2 End If If pic.Height > ownerPnl.Height Then If newy + pic.Height > ownerPnl.Height And newy < 0 Then pic.Top = newy Else If newy < 0 Then pic.Top = ownerPnl.Height - pic.Height Else pic.Top = 0 End If End If Else pic.Top = (ownerPnl.Height - pic.Height) / 2 End If End Sub
There is a class which is used for image positionCode:Private Sub ZoomIn() Dim w, h As Integer pb.SizeMode = PictureBoxSizeMode.StretchImage w = pb.Width h = pb.Height pb.Width = pb.Width * 1.1 pb.Height = pb.Height * 1.1 Dim x = pb.Left - (pb.Width - w) / 2 Dim y = pb.Top - (pb.Height - h) / 2 MovePicto(pb, x, y) Move2Center(pb, Panel1) End Sub Public Sub ZoomOut() Dim w, h As Integer pb.SizeMode = PictureBoxSizeMode.StretchImage w = pb.Width h = pb.Height pb.Width = pb.Width / 1.1 pb.Height = pb.Height / 1.1 Dim x = pb.Left - (pb.Width - w) / 2 Dim y = pb.Top - (pb.Height - h) / 2 MovePicto(pb, x, y) Move2Center(pb, Panel1) End Sub
Purpose of this code is to show all the functions and classes bcoz all functions are being called from each other.Code:Public Class ImagePosition Public Sub SetPosition(ByVal picPanel As Panel, ByVal picResim As PictureBox, Optional ByVal Param As String = "keepratio") Dim X, Y, ScrX, ScrY, PosX, PosY, PicX, PicY As Integer Dim ratio As Double Try ' picResim.Visible = False 'Hide picture PicX = picResim.Image.Width 'get pictures width PicY = picResim.Image.Height 'get pictures height ratio = PicX / PicY 'calculate aspect ratio ScrX = picPanel.Width 'get containers width ScrY = picPanel.Height 'get containers height 'picPanel.AutoScroll = False Select Case LCase(Param) Case "normal" 'if normal picPanel.AutoScroll = True 'add scrool bars picResim.Width = PicX 'adjust pictures width picResim.Height = PicY 'and height to the original sizes. picResim.SizeMode = PictureBoxSizeMode.Normal 'Change to normal mode If (picResim.Width > picPanel.Width) And (picResim.Height > picPanel.Height) Then 'if picture larger than container PosX = 0 'set position X PosY = 0 'set position Y End If If (picResim.Width > picPanel.Width) And (picResim.Height < picPanel.Height) Then 'if picture wider than container PosX = 0 Y = picResim.Height 'get height PosY = CInt((ScrY - Y) / 2) 'calculate position Y End If If (picResim.Width < picPanel.Width) And (picResim.Height > picPanel.Height) Then 'if picture taller than container PosY = 0 X = picResim.Width 'get width PosX = CInt((ScrX - X) / 2) 'calculate position Y End If If (picResim.Width < picPanel.Width) And (picResim.Height < picPanel.Height) Then 'if picture smaller than container X = picResim.Width 'get width Y = picResim.Height 'get height PosX = CInt((ScrX - X) / 2) 'calculate position X PosY = CInt((ScrY - Y) / 2) 'calculate position Y End If Case "fit" picResim.Width = ScrX 'adjust pictures width picResim.Height = ScrY 'and height to the form sizes. picResim.SizeMode = PictureBoxSizeMode.StretchImage PosX = 0 'set position X PosY = 0 'set position Y Case "center" picResim.Width = PicX 'adjust pictures width picResim.Height = PicY 'and height to the form sizes. picResim.SizeMode = PictureBoxSizeMode.CenterImage X = picResim.Width 'get width Y = picResim.Height 'get height PosX = CInt((ScrX - X) / 2) 'calculate position X PosY = CInt((ScrY - Y) / 2) 'calculate position Y Case "keepratio" If PicX >= PicY Then 'check whether pic. width greater than height picResim.Width = ScrX 'yes, then main size is width picResim.Height = CInt(picResim.Width / ratio) 'calculate height with aspect ratio If picResim.Height > ScrY Then picResim.Height = ScrY 'no, then main size is height picResim.Width = CInt(picResim.Height * ratio) 'calculate width with aspect ratio End If Else picResim.Height = ScrY 'no, then main size is height picResim.Width = CInt(picResim.Height * ratio) 'calculate width with aspect ratio If picResim.Width > ScrX Then picResim.Width = ScrX 'yes, then main size is width picResim.Height = CInt(picResim.Width / ratio) 'calculate height with aspect ratio End If End If picResim.SizeMode = PictureBoxSizeMode.StretchImage 'resize the picture X = picResim.Width 'get width Y = picResim.Height 'get height PosX = CInt((ScrX - X) / 2) 'calculate position X PosY = CInt((ScrY - Y) / 2) 'calculate position Y Case Else End Select picResim.Left = PosX 'adjust the position() picResim.Top = PosY picResim.Visible = True 'show picture Catch End Try End Sub End Class
So if I use this code then picture is fit into the picture box when first a thumbnail is clicked and a form is displayed and on resizing the form it also fits in the picture box but when I go to edit menu and open resize picture dialog box and enter height and width and press ok button then this picture is not resized according to the entered height and width but picture is shrinking and it is displayed in bad quality and so no resizing is performed. But I have an other function which can resize the picture with mouse handling, catching the picture from one of its side or one its corner and drag them in and out so picture is resized up to desired size.
This is for resizing the formCode:Private Sub DrawToScale(ByVal bmp As Image) On Error Resume Next pb.Image = New Bitmap(bmp) pb.SizeMode = PictureBoxSizeMode.Normal If Auto_Size Then Pic2Pic(pb, Panel1, Enlarge, Shrink) End Sub
But if I remove following line from both the codes given above then picture is not fit into the picture into picture box and it’s some portion is not displayed when picture is loaded into form and the same case for form resizing. But picture resizing is performed successfully when I go to edit menu and open picture resize dialog box and enter height and width and press ok button then picture is resized according to entered values. But if I zoom in or zoom out the picture the again picture shrinking problem occurs and also when I try to resize it with mouse then it is not resizing well, it is not resizing from corners but from only one corner and only from one side and it also seems that as I cropping the picture but not resizing .resizing handle is appear at top left corner and top and left sides. If I resize it through dialog box and picture size is small then it is only moving but not resizing and if picture size is bigger then it is showing strange behavior.Code:Private Sub PopupForm_Resize(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Resize On Error Resume Next If Auto_Size Then Pic2Pic(pb, Panel1, Enlarge, Shrink) End Sub
The line which I remove is
Now above code becomesCode:If Auto_Size Then Pic2Pic(pb, Panel1, Enlarge, Shrink)
This is for resizing the formCode:Private Sub DrawToScale(ByVal bmp As Image) On Error Resume Next pb.Image = New Bitmap(bmp) pb.SizeMode = PictureBoxSizeMode.Normal End Sub
So what should I do now. I want to perform both the tasks perfectly. I want to fit the picture in picture box, I want to do resizing and I also want to do zooming. I want to resize the picture with mouse perfectly. What changes I should make to overcome these issues.??Code:Private Sub PopupForm_Resize(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Resize On Error Resume Next End Sub
This is the detail which I have given….if full code is needed then I can upload it also.
See attachment for more details.
thanks


Reply With Quote