2012-05-09 61 views
2

我有以下代码:转换位图以字节

Private Function SizeLogo(ByVal logoBytes As Byte()) As Byte() 
     Using originalMemStream As MemoryStream = New MemoryStream(logoBytes), 
      originalImage As System.Drawing.Image = System.Drawing.Image.FromStream(originalMemStream) 

      Dim width As Integer = originalImage.Width 
      Dim height As Integer = originalImage.Height 
      Dim targetWidth As Integer = 300 
      Dim targetHeight As Integer = 200 
      Dim newHeight As Integer = 0 
      Dim newWidth As Integer = 0 

      Using oBitmap As New Bitmap(300, 200) 
       Using oGraphic As Graphics = Graphics.FromImage(oBitmap) 

        Using oBrush As New SolidBrush(Color.White) 
         oGraphic.FillRectangle(oBrush, 0, 0, targetWidth, targetHeight) 
        End Using 

        Using oProduto As System.Drawing.Image = Drawing.Image.FromStream(originalMemStream) 

         Dim targetRatio As Decimal = CDec(targetWidth)/CDec(targetHeight) 
         Dim imageRatio As Decimal = CDec(width)/CDec(height) 

         If targetRatio > imageRatio Then 
          newHeight = targetHeight 
          newWidth = CInt(Math.Floor(imageRatio * CDec(targetHeight))) 
         Else 
          newHeight = CInt(Math.Floor(CDec(targetWidth)/imageRatio)) 
          newWidth = targetWidth 
         End If 

         If newWidth > targetWidth Then newWidth = targetWidth 
         If newHeight > targetHeight Then newHeight = targetHeight 

         oGraphic.DrawImage(oProduto, 0, 0, newWidth, newHeight) 



         **Using thumbImage As Drawing.Image = oGraphic. .GetThumbnailImage(targetWidth, targetHeight, Nothing, IntPtr.Zero), 
         outMemStream As MemoryStream = New MemoryStream() 

          thumbImage.Save(outMemStream, ImageFormat.Jpeg) 
          Return outMemStream.ToArray() 
         End Using** 
        End Using 
       End Using 
      End Using 
     End Using 
    End Function 

我所试图做的是

  1. 创建300width和200height白色位
  2. 绘制并上传到中心图像中心

我的问题是我无法保存创建的图像。这是一个转换问题吗?我突出了代码,我认为我失败了。

回答

1

您需要保存oBitmap。此外,如果你想将300×200的位图中居中图像,您将需要通过计算X,Y向oGraphic.DrawImage强似0,0

下面是代码(注意,我已经改变了固体刷颜色为红色为清楚起见,请务必将它改成白色为你的情况)

Private Function SizeLogo(ByVal logoBytes As Byte()) As Byte() 
    Using originalMemStream As MemoryStream = New MemoryStream(logoBytes), 
     originalImage As System.Drawing.Image = System.Drawing.Image.FromStream(originalMemStream) 

     Dim width As Integer = originalImage.Width 
     Dim height As Integer = originalImage.Height 
     Dim targetWidth As Integer = 300 
     Dim targetHeight As Integer = 200 
     Dim newHeight As Integer = 0 
     Dim newWidth As Integer = 0 

     Using oBitmap As New Bitmap(300, 200) 
      Using oGraphic As Graphics = Graphics.FromImage(oBitmap) 

       Using oBrush As New SolidBrush(Color.Red) 
        oGraphic.FillRectangle(oBrush, 0, 0, targetWidth, targetHeight) 
       End Using 

       Using oProduto As System.Drawing.Image = Drawing.Image.FromStream(originalMemStream) 

        Dim targetRatio As Decimal = CDec(targetWidth)/CDec(targetHeight) 
        Dim imageRatio As Decimal = CDec(width)/CDec(height) 

        If targetRatio > imageRatio Then 
         newHeight = targetHeight 
         newWidth = CInt(Math.Floor(imageRatio * CDec(targetHeight))) 
        Else 
         newHeight = CInt(Math.Floor(CDec(targetWidth)/imageRatio)) 
         newWidth = targetWidth 
        End If 

        If newWidth > targetWidth Then newWidth = targetWidth 
        If newHeight > targetHeight Then newHeight = targetHeight 

        Dim x As Integer = 0 
        Dim y As Integer = 0 

        If (newWidth < targetWidth) Then 
         x = (targetWidth - newWidth)/2 
        End If 

        If (newHeight < targetHeight) Then 
         y = (targetHeight - newHeight)/2 
        End If 

        oGraphic.DrawImage(oProduto, x, y, newWidth, newHeight) 

        'uncomment this to save to file (just to test output) 
        'oBitmap.Save("D:\penguins.bmp") 

        Dim outMemStream As MemoryStream = New MemoryStream() 
        oBitmap.Save(outMemStream, ImageFormat.Jpeg) 
        Return outMemStream.GetBuffer() 

       End Using 
      End Using 
     End Using 
    End Using 
End Function 

输出图像看起来就像

enter image description here

+0

谢谢!你摇滚! –

+0

谢谢:)不客气 –