vb中控件图形框如何加载图片

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了vb中控件图形框如何加载图片相关的知识,希望对你有一定的参考价值。

参考技术A

使用 LoadPicture 函数,指定一文件名,并将该图片赋值给 Picture 属性。 
Picture1.Picture
=
LoadPicture("C:\\1.png")'这是加载一个位图*.png
Picture1.Picture
=
LoadPicture("C:\\1.jpg")'这是加载一个位图*.jpg
Picture1.Picture
=
LoadPicture("C:\\1.bmp")'这是加载一个位图*.bmp
使用 LoadResPicture 函数,从指定的资源文件中加载,并将该资源赋值给 Picture 属性。 
下列语句将资源文件里资源标识号 ID 为 1
的位图,加载到名为 Picture1 的图片框内:
Set
Picture1.Picture
=LoadResPicture(101,0)'这是加载一个位图*.bmp
Set Picture1.Icon=LoadResPicture(101,1)'这是加载一个*.ico
Set
Picture1.Icon=LoadResPicture(101.2)'这是加载一个*.cur
运行结果:

如何在 vb.net 中使用滚轮放大图片框

【中文标题】如何在 vb.net 中使用滚轮放大图片框【英文标题】:How to zoom in a Picturebox with scrollwheel in vb.net 【发布时间】:2012-11-09 21:46:48 【问题描述】:

我正在使用一组图形叠加层来使用图形对象在图片框控件内绘制图像。我已将 Picturebox 放置在 Panel 内并将 Panel 设置为自动滚动。我现在需要知道如何做的是使用鼠标滚轮以小增量放大图片的大小,同时保持绘制的图像质量。有人知道怎么做吗?

当我使用下面的 Abdias Software 代码更新时,当图片框的 Sizemode 属性设置为 StretchImage 时,图片开始变小。我的鼠标具有平移功能,可能会干扰此代码无法正常工作。有任何想法吗?是什么导致它无法正常工作?

已解决

这段代码对我来说比下面的任何一个都好得多:

Private Sub PictureBox_MouseWheel(sender As System.Object,
                             e As MouseEventArgs) Handles PictureBox1.MouseWheel
    If e.Delta <> 0 Then
        If e.Delta <= 0 Then
            If PictureBox1.Width < 500 Then Exit Sub 'minimum 500?
        Else
            If PictureBox1.Width > 2000 Then Exit Sub 'maximum 2000?
        End If

        PictureBox1.Width += CInt(PictureBox1.Width * e.Delta / 1000)
        PictureBox1.Height += CInt(PictureBox1.Height * e.Delta / 1000)
    End If

End Sub

【问题讨论】:

我添加了您的代码并按预期启用了移动,并且缩放也可以正常工作。这些事件无论如何都是分开的,所以它们不应该干扰。 sizemode 强制图像为控件的大小,因此如果控件大小小于图像,则图像将缩小。您可以在加载事件(或设置图像的方法)中设置PictureBox1.Size = New Size(bmp.Width, bmp.Height)(也可以使用相同的方式更新_origjnalSize)。除此之外,如果不查看更多代码,我看不到任何潜在的问题。 我使用了你所有的代码,只是图片不同,但仍然有效。 (就像一个旁注:我不确定你为什么把 SetStyle() 放在那里。它们是为用户控件而设计的,在这一点上我不会做太多的代码)。除了一切都按预期工作(即使启用了 setstyles)。这有点神秘。我在 XP 顺便说一句。我认为这并不重要,但如果您使用的是其他 win 版本,则值得一试并希望消除。 我正在使用带有 Visual Studio Express 2012 的 Windows 7。您认为这可能是他们尚未修复的错误吗?我不想移动所有这些代码并将所有内容重绘到 Visual Basic Express 2010。Uggg!如果您不介意我问,您在 PictureBox 控件和 Panel 控件中的属性设置是什么。不知道是不是这么简单。但谁知道也许我的一个疯了。 这是我的所有设置:pastebin.com/FnAzVKzF 这可能是 VS2012 中的一个错误,它肯定是这样的。不过只有一种方法可以找出答案.. :) 【参考方案1】:

你可以试试这个代码。它假设表单上存在Panel1PictureBox1Panel1 内的PictureBox1Panel1.AutoScroll = True),并在PictureBox 上设置图像。

代码不会计算缩放的中心点,但您可以使用 e.Location(或 e.X/e.Y)。

更新 - 这是(应该)比以前更健壮的新代码(见底部):

Public Class Form1

    Private _originalSize As Size = Nothing
    Private _scale As Single = 1
    Private _scaleDelta As Single = 0.0005

    Private Sub Form_MouseWheel(sender As System.Object, e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseWheel

        'if very sensitive mouse, change 0.00005 to something even smaller   
        _scaleDelta = Math.Sqrt(PictureBox1.Width * PictureBox1.Height) * 0.00005

        If e.Delta < 0 Then
            _scale -= _scaleDelta
        ElseIf e.Delta > 0 Then
            _scale += _scaleDelta
        End If

        If e.Delta <> 0 Then _
        PictureBox1.Size = New Size(CInt(Math.Round(_originalSize.Width * _scale)), _
                                    CInt(Math.Round(_originalSize.Height * _scale)))

    End Sub

    Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
        PictureBox1.SizeMode = PictureBoxSizeMode.StretchImage

        'init this from here or a method depending on your needs
        If PictureBox1.Image IsNot Nothing Then
            PictureBox1.Size = Panel1.Size
            _originalSize = Panel1.Size
        End If

    End Sub

End Class

旧代码 - 可以工作,但可能由于 Scale() 中的舍入错误而在大更改时不稳定:

Public Class Form1

    Private _scale As New SizeF(1, 1)
    Private _scaleDelta As New SizeF(0.01, 0.01) '1% for each wheel tick

    Private Sub Form_MouseWheel(sender As System.Object, 
                                e As MouseEventArgs) Handles Me.MouseWheel
'count incrementally 
        _scale.Height = 1
        _scale.Width = 1

        If e.Delta < 0 Then
            _scale += _scaleDelta
        ElseIf e.Delta > 0 Then
            _scale -= _scaleDelta
        End If

        If e.Delta <> 0 Then _
        PictureBox1.Scale(_scale)

    End Sub

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

        PictureBox1.SizeMode = PictureBoxSizeMode.StretchImage

        'init picturebox size = image size
        If PictureBox1.Image IsNot Nothing Then
            PictureBox1.Scale(New SizeF(1, 1))
            PictureBox1.Size = PictureBox1.Image.Size
        End If

    End Sub

End Class

【讨论】:

我尝试了代码,它运行良好,但似乎有一个大问题。当我启动程序时,图片框会在添加代码之前自动缩小图片的全尺寸。当我使用滚轮时,它会变小,当我以其他方式滚动时,它会变大,直到只有图片大小的一半。任何线索是什么原因造成的? 我在表单的加载事件中添加了一个小代码-sn-p,以将 pbox 的大小调整为设置在其上的图像的大小。如果图像是从其他地方设置的,当然只需将代码移动到那里。 @GregWillard 我可能是一个舍入错误问题。另一种方法是直接使用变量计算 Size,而不是使用 Scale()。我将进行测试以确认是否使用该代码更新我的答案。 我已经更新了我的原始帖子,看看是否是该代码导致了问题。谢谢,让我知道。 :) 我已经用另一种看起来稳定的方法更新了代码。【参考方案2】:

基本上,您需要一个图像查看器。我以前用过这个: http://cyotek.com/blog/creating-a-scrollable-and-zoomable-image-viewer-in-csharp-part-4

效果很好。但是,它是一个用户控件。

对于图片框,您需要从图像中创建图形,然后对其进行插值。这是一个例子: http://www.dotnetcurry.com/ShowArticle.aspx?ID=196

我没有检查这个,但看起来可以。

【讨论】:

感谢您的回复,但我希望在 VB.NET 中完成此操作,并且不使用第三方控件。 检查第二个链接,它有 c# 和 vb 代码。它是用于图片框的,但我之前没有尝试过。 我看到了,这是一个很好的例子,但是我正在寻找一个使用鼠标滚轮而不是缩放滑块滚动的例子。谢谢!【参考方案3】:

我注意到StretchImage SizeMode 忽略图像比例会产生不良影响。我刚刚添加了一个宽度和高度比率变量以包含在“缩放”算法中。请参阅下面代码中的_ratWidth_ratHeight

Public Class Form1

Private _originalSize As Size = Nothing
Private _scale As Single = 1
Private _scaleDelta As Single = 0.0005
Private _ratWidth, _ratHeight As Double

Private Sub Form_MouseWheel(sender As System.Object, e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseWheel

    'if very sensitive mouse, change 0.00005 to something even smaller   
    _scaleDelta = Math.Sqrt(PictureBox1.Width * PictureBox1.Height) * 0.00005

    If e.Delta < 0 Then
        _scale -= _scaleDelta
    ElseIf e.Delta > 0 Then
        _scale += _scaleDelta
    End If

    If e.Delta <> 0 Then _
    PictureBox1.Size = New Size(CInt(Math.Round((_originalSize.Width * _ratWidth) * _scale)), _
                                CInt(Math.Round((_originalSize.Height * _ratHeight) * _scale)))

End Sub

Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
    PictureBox1.SizeMode = PictureBoxSizeMode.StretchImage

    'init this from here or a method depending on your needs
    If PictureBox1.Image IsNot Nothing Then
        _ratWidth = PictureBox1.Image.Width / PictureBox1.Image.Height
        _ratHeight = PirctureBox1.Image.Height / PictureBox1.Image.Width
        PictureBox1.Size = Panel1.Size
        _originalSize = Panel1.Size
    End If
End Sub
End Class

【讨论】:

以上是关于vb中控件图形框如何加载图片的主要内容,如果未能解决你的问题,请参考以下文章

怎么在VB的图片框里加载PNG格式的图片,或在窗口上显示PNG图片?

怎么在VB的图片框里加载PNG格式的图片,或在窗口上显示PNG图片?

如何在VB中使用PNG格式的图片

VB设计里image与picturebox有啥区别?

在C#的winform中,如何快速加载窗体,避免控件的背景图片闪烁?

怎样清除VB中picture控件中插入的jpg图片