我有以下代码:
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
我想做的是
我的问题是我无法保存创建的图像。这是转换问题吗?我突然强调了我认为自己失败的代码。
答案 0 :(得分:1)
您需要保存oBitmap。此外,如果您想将图像置于300 x 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
输出图像看起来像