VB.NET调整大小并裁剪图像

时间:2017-04-19 18:06:40

标签: vb.net vsto image-resizing

我有一个用于powerpoint的VSTO,并希望调整图像大小,使它们与幻灯片的大小相同。我的样本图像是1000x300,幻灯片是960x540。所以这是我的代码:

_W=960
_H=540

Dim img As Image = System.Drawing.Bitmap.FromFile(file1)
OldRect = New RectangleF(233, 0, 533, 300) ' calculated values to crop left and right 
NewRect = New RectangleF(0, 0, _W, _H)

Dim bmp As Bitmap = New Bitmap(img, _W, _H)
Dim g As Graphics = Graphics.FromImage(bmp)
g.InterpolationMode = Drawing2D.InterpolationMode.HighQualityBicubic
g.PixelOffsetMode = Drawing2D.PixelOffsetMode.HighQuality
g.CompositingQuality = Drawing2D.CompositingQuality.HighQuality
g.DrawImage(img, NewRect, OldRect, GraphicsUnit.Pixel) 
img.Save(file2, Imaging.ImageFormat.Png)

但是当我查看file2时,它与原始文件相同,是1000x300文件。我在这里失踪了什么?

2 个答案:

答案 0 :(得分:0)

@plutonix;你是现货。我错误地认为DrawImage将取代它所提供的图像。但是保存创建图形对象的位图会产生预期的图像。

bmp.Save(file2, Imaging.ImageFormat.Png) 

完美无缺。谢谢!

答案 1 :(得分:-1)

这里发布的答案很好,但是有一个主要的质量问题需要解决。在大多数情况下,您必须裁剪图像并保持质量,因此在这方面,我改进了示例的裁剪功能,并在下面发布了链接。该演示程序位于VB.NET中,但您可以轻松理解该概念并进行调整。

http://www.mediafire.com/file/70rmlpcdjyxo8gc/ImageCroppingDemo_-_Maintain_Image_Quality.zip/file

裁剪代码(VB.NET)

Dim cropX As Integer
Dim cropY As Integer
Dim cropWidth As Integer
Dim cropHeight As Integer
Dim oCropX As Integer
Dim oCropY As Integer
Dim cropBitmap As Bitmap
Dim Loadedimage As Image

Public cropPen As Pen
Public cropPenSize As Integer = 1 '2
Public cropDashStyle As Drawing2D.DashStyle = Drawing2D.DashStyle.Solid
Public cropPenColor As Color = Color.Yellow

Private Sub crobPictureBox_MouseDown(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles crobPictureBox.MouseDown
    Try

        If e.Button = Windows.Forms.MouseButtons.Left Then

            cropX = e.X
            cropY = e.Y

            cropPen = New Pen(cropPenColor, cropPenSize)
            cropPen.DashStyle = DashStyle.DashDotDot
            Cursor = Cursors.Cross

        End If
        crobPictureBox.Refresh()
    Catch exc As Exception
    End Try
End Sub
Dim tmppoint As Point
Private Sub crobPictureBox_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles crobPictureBox.MouseMove
    Try

        If crobPictureBox.Image Is Nothing Then Exit Sub

        If e.Button = Windows.Forms.MouseButtons.Left Then

            crobPictureBox.Refresh()
            cropWidth = e.X - cropX
            cropHeight = e.Y - cropY
            crobPictureBox.CreateGraphics.DrawRectangle(cropPen, cropX, cropY, cropWidth, cropHeight)
        End If
        ' GC.Collect()

    Catch exc As Exception

        If Err.Number = 5 Then Exit Sub
    End Try

End Sub

Private Sub crobPictureBox_MouseUp(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles crobPictureBox.MouseUp
    Try
        Cursor = Cursors.Default
        Try

            If cropWidth < 1 Then
                Exit Sub
            End If

            Dim smallWidthPercentage As Single = (cropWidth / crobPictureBox.Width) * 100
            Dim smallHeightPercentage As Single = (cropHeight / crobPictureBox.Height) * 100

            Dim smallXPercentage As Single = (cropX / crobPictureBox.Width) * 100
            Dim smallYPercentage As Single = (cropY / crobPictureBox.Height) * 100

            smallHeightPercentage += 10
            smallYPercentage -= 10

            Dim Widthdifference As Integer = Loadedimage.Width - crobPictureBox.Width
            Dim HeightDifference As Integer = Loadedimage.Height - crobPictureBox.Height

            Dim rect As Rectangle
            rect = New Rectangle((smallXPercentage / 100) * Loadedimage.Width, (smallYPercentage / 100) * Loadedimage.Height, (smallWidthPercentage / 100) * Loadedimage.Width, (smallHeightPercentage / 100) * Loadedimage.Height)

            Dim bit As Bitmap = New Bitmap(Loadedimage, Loadedimage.Width, Loadedimage.Height)

            cropBitmap = New Bitmap(Loadedimage, (smallWidthPercentage / 100) * Loadedimage.Width, (smallHeightPercentage / 100) * Loadedimage.Height)

            Dim g As Graphics = Graphics.FromImage(cropBitmap)
            g.InterpolationMode = Drawing2D.InterpolationMode.HighQualityBicubic
            g.PixelOffsetMode = Drawing2D.PixelOffsetMode.HighQuality
            g.CompositingQuality = Drawing2D.CompositingQuality.HighQuality
            g.DrawImage(bit, 0, 0, rect, GraphicsUnit.Pixel)
            PreviewPictureBox.Image = cropBitmap

        Catch exc As Exception
        End Try
    Catch exc As Exception
    End Try
End Sub