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. 300幅と200高さの白いビットマップを作成します
  2. センターにアップロードされた画像を描画して中央に配置

私の問題は、作成した画像を保存できないことです。これは変換の問題ですか?失敗していると思うコードを強調表示しました。

4

1 に答える 1

1

oBitmap を保存する必要があります。また、300 x 200 ビットマップ内で画像を中央に配置したい場合は、oGraphic.DrawImage0, 0 を渡す代わりに計算された x, y を渡す必要があります。

コードは次のとおりです(わかりやすくするために、ソリッドブラシの色を赤に変更したことに注意してください。場合によっては、必ず白に変更してください)

    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

出力画像は次のようになります

ここに画像の説明を入力

于 2012-05-09T14:16:15.903 に答える