2010-01-27 18 views
10

Ich möchte ein einfaches VB-Dienstprogramm erstellen, um Bilder mit vb.net zu skalieren. Ich habe Probleme herauszufinden, welche Vb-Klasse zu verwenden, um die Bilder tatsächlich zu manipulieren. Die Image-Klasse und die Bitmap-Klasse funktionieren nicht.Ändern der Größe von Bildern in VB.NET

Alle Ideen, Hinweise, Tipps, Tutorial-Links werden sehr geschätzt.

Danke.

Antwort

13

Here is an article mit vollständigen Details, wie dies zu tun ist.

Private Sub btnScale_Click(ByVal sender As System.Object, _ 
    ByVal e As System.EventArgs) Handles btnScale.Click 
    ' Get the scale factor. 
    Dim scale_factor As Single = Single.Parse(txtScale.Text) 

    ' Get the source bitmap. 
    Dim bm_source As New Bitmap(picSource.Image) 

    ' Make a bitmap for the result. 
    Dim bm_dest As New Bitmap(_ 
     CInt(bm_source.Width * scale_factor), _ 
     CInt(bm_source.Height * scale_factor)) 

    ' Make a Graphics object for the result Bitmap. 
    Dim gr_dest As Graphics = Graphics.FromImage(bm_dest) 

    ' Copy the source image into the destination bitmap. 
    gr_dest.DrawImage(bm_source, 0, 0, _ 
     bm_dest.Width + 1, _ 
     bm_dest.Height + 1) 

    ' Display the result. 
    picDest.Image = bm_dest 
End Sub 

[Bearbeiten]
One more auf den ähnlichen Linien.

2

Sie wissen viel VB.NET Syntax nicht, aber hier ist und Idee

Dim source As New Bitmap("C:\image.png") 
Dim target As New Bitmap(size.Width, size.Height, PixelFormat.Format24bppRgb) 

Using graphics As Graphics = Graphics.FromImage(target) 
    graphics.DrawImage(source, new Size(48, 48)) 
End Using 
4

Dies wird die beste Qualität mit Unterstützung jedes Bild unter Verwendung von für 32bpp mit Alpha-Größe neu. Beim neuen Bild wird das Originalbild im ursprünglichen Seitenverhältnis innerhalb des neuen Bildes zentriert.

#Region " ResizeImage " 
    Public Overloads Shared Function ResizeImage(SourceImage As Drawing.Image, TargetWidth As Int32, TargetHeight As Int32) As Drawing.Bitmap 
     Dim bmSource = New Drawing.Bitmap(SourceImage) 

     Return ResizeImage(bmSource, TargetWidth, TargetHeight) 
    End Function 

    Public Overloads Shared Function ResizeImage(bmSource As Drawing.Bitmap, TargetWidth As Int32, TargetHeight As Int32) As Drawing.Bitmap 
     Dim bmDest As New Drawing.Bitmap(TargetWidth, TargetHeight, Drawing.Imaging.PixelFormat.Format32bppArgb) 

     Dim nSourceAspectRatio = bmSource.Width/bmSource.Height 
     Dim nDestAspectRatio = bmDest.Width/bmDest.Height 

     Dim NewX = 0 
     Dim NewY = 0 
     Dim NewWidth = bmDest.Width 
     Dim NewHeight = bmDest.Height 

     If nDestAspectRatio = nSourceAspectRatio Then 
      'same ratio 
     ElseIf nDestAspectRatio > nSourceAspectRatio Then 
      'Source is taller 
      NewWidth = Convert.ToInt32(Math.Floor(nSourceAspectRatio * NewHeight)) 
      NewX = Convert.ToInt32(Math.Floor((bmDest.Width - NewWidth)/2)) 
     Else 
      'Source is wider 
      NewHeight = Convert.ToInt32(Math.Floor((1/nSourceAspectRatio) * NewWidth)) 
      NewY = Convert.ToInt32(Math.Floor((bmDest.Height - NewHeight)/2)) 
     End If 

     Using grDest = Drawing.Graphics.FromImage(bmDest) 
      With grDest 
       .CompositingQuality = Drawing.Drawing2D.CompositingQuality.HighQuality 
       .InterpolationMode = Drawing.Drawing2D.InterpolationMode.HighQualityBicubic 
       .PixelOffsetMode = Drawing.Drawing2D.PixelOffsetMode.HighQuality 
       .SmoothingMode = Drawing.Drawing2D.SmoothingMode.AntiAlias 
       .CompositingMode = Drawing.Drawing2D.CompositingMode.SourceOver 

       .DrawImage(bmSource, NewX, NewY, NewWidth, NewHeight) 
      End With 
     End Using 

     Return bmDest 
    End Function 
#End Region 
+0

'Drawing2D.SmoothingMode' gilt hier nicht, es für 2D-Vektor-Zeichenprogramm ist nur relevant, Methoden wie 'Graphics.DrawLine' – alldayremix

+0

Seien Sie vorsichtig damit. Die 'With grDest'-Sektion schien die Alpha-Werte nur geringfügig zu erhöhen, was sich nur bei der iterativen Verarbeitung des gleichen Bildes mit einem halb-opaken Element im Bild bemerkbar machte. Im Laufe der Zeit wurde dies immer undurchsichtiger. Ich habe den .SmoothingMode-Teil und den CompositingMode zu SourceCopy auskommentiert. Noch Tests, aber einer von diesen beiden scheint es getan zu haben. Angst, ich kann keine genaue Antwort geben, da ich GDI nicht so gut verstehe. Vielleicht kann @Carter angesichts seines Wissens über GDI weiter helfen. – stigzler

12

Sie können einfach verwenden diese eine Zeile Code Ihr Bild in Visual Basic .NET

Public Shared Function ResizeImage(ByVal InputImage As Image) As Image 
     Return New Bitmap(InputImage, New Size(64, 64)) 
End Function 

Wo die Größe;

  1. "InputImage" ist das Bild, das Sie in der Größe ändern möchten.
  2. „64 X 64“ ist die erforderliche Größe, die Sie ändern können, wie Ihre Bedürfnisse, dh 32X32 usw.
0
Dim x As Integer = 0 
    Dim y As Integer = 0 
    Dim k = 0 
    Dim l = 0 
    Dim bm As New Bitmap(p1.Image) 
    Dim om As New Bitmap(p1.Image.Width, p1.Image.Height) 
    Dim r, g, b As Byte 
    Do While x < bm.Width - 1 
     y = 0 
     l = 0 
     Do While y < bm.Height - 1 
      r = 255 - bm.GetPixel(x, y).R 
      g = 255 - bm.GetPixel(x, y).G 
      b = 255 - bm.GetPixel(x, y).B 
      om.SetPixel(k, l, Color.FromArgb(r, g, b)) 
      y += 3 
      l += 1 
     Loop 
     x += 3 
     k += 1 
    Loop 
    p2.Image = om 
Verwandte Themen