Hallo!
Hier zwei Funktionen, die das Prinzip der JPEG-Komprimierung demonstrieren.
"GetJPEGBytesFromFile" erhält eine Bilddatei in einem
unterstützten Format (BMP, JPG, TIF, GIF, PNG).
Als weiterer Parameter wird die gewünschte Größe des
Bildes (Size-Parameter) angegeben.
Zuletzt noch die gewünschte Komprimierungs-Qualität
50 = gering, 95 = sehr gut
Die Funktion liefert die komprimierte Bytefolge, die
Grundlage für die Speicherung des Bildes in einem Memofeld ist.
Die Funktion "GetBitmapFromJPEGBytes" erstellt aus der
Bytefolge (abgefragt aus der DB) wieder ein Bitmap-Bild.
''' <summary>Komprimnieren der Bild-Daten</summary>
''' <param name="file">Pfad der Bilddatei</param>
''' <param name="Picsize">Größe des Bildes im Speicher</param>
'''<param name="PicQuality">Qualität des kompr. Bildes (50-95)</param>
''' <returns>Komprimierte Bilddaten (Byte-Array) oder Nothing</returns>
Public Function GetJPGBytesFromFile(ByVal file As String, ByVal Picsize As _
Size, _
ByVal PicQuality As Integer) As Byte()
Dim pt, pl, pw, ph As Integer
'Für JPEG-Komptimierung
Dim EncoderInfo As Imaging.ImageCodecInfo = GetEncoderInfo("JPEG")
Dim EncoderParameters As New Imaging.EncoderParameters(1)
EncoderParameters.Param(0) = New _
Imaging.EncoderParameter(Imaging.Encoder.Quality, CType(PicQuality, _
System.Int32))
Try
Using bmp As New Bitmap(file), _
ibmp As New Bitmap(Picsize.Width, Picsize.Height, _
Imaging.PixelFormat.Format24bppRgb), _
gr As Graphics = Graphics.FromImage(ibmp), _
ms As New IO.MemoryStream
'Bildgröße in Fläche einpassen und Bild zentrieren
pt = 0 : pl = 0 : pw = bmp.Width : ph = bmp.Height
If pw > Picsize.Width Then
pw = Picsize.Width : ph = CInt(bmp.Height * pw / bmp.Width)
pt = (Picsize.Height - ph) \ 2
End If
If ph > Picsize.Height Then
ph = Picsize.Height : pw = CInt(bmp.Width * ph / bmp.Height)
pl = (Picsize.Width - pw) \ 2 : pt = 0
End If
'Bild in neuer Größe zeichnen
Dim srcrect As New Rectangle(0, 0, bmp.Width, bmp.Height)
Dim destrect As New Rectangle(pl, pt, pw, ph)
gr.Clear(Color.White)
gr.DrawImage(bmp, destrect, srcrect, GraphicsUnit.Pixel)
'Bilddaten JPEG-komprimieren und in den Speicher-Stream
' schreiben
ibmp.Save(ms, EncoderInfo, EncoderParameters)
'Komprimierte Bilddaten als Bytefolge zurückgeben
Dim jpg_bytes As Byte() = ms.GetBuffer()
Return jpg_bytes
End Using
Catch ex As System.Exception
Return Nothing
End Try
End Function
Public Function GetBitmapFromJPGBytes(ByVal JPGBytes() As Byte) As Bitmap
Using ms As New IO.MemoryStream
'Bilddaten (JPEG) in den Speicherstream übertragen
ms.Write(JPGBytes, 0, JPGBytes.Length)
'Bilddaten dekomprimieren (per Bitmap-Objekt)
Return CType(Bitmap.FromStream(ms), Bitmap)
End Using
End Function
''' <summary>Hilfsfunktion ermittelt den GDI+-Encoder zu einem
' Bildformat-Descriptor</summary>
Private Function GetEncoderInfo( _
ByVal FormatDescriptor As String) As Imaging.ImageCodecInfo
Dim i As Integer = 0
Dim encoders() As Imaging.ImageCodecInfo = _
Imaging.ImageCodecInfo.GetImageEncoders()
FormatDescriptor = FormatDescriptor.ToUpper.Trim
While i < encoders.Length
If encoders(i).FormatDescription.ToUpper = FormatDescriptor Then
Return encoders(i)
End If
i += 1
End While
Return Nothing
End Function
Beitrag wurde zuletzt am 09.02.12 um 17:42:25 editiert. |