Forums Neueste Beiträge
 

Skaliertes Bitmap wird unscharf

13/02/2010 - 16:04 von Bernd Schend | Report spam
Hallo zusammen,

mein Programm fügt über die Zwischenablage ein vorher
skaliertes Bitmap(= Logo) in ein Word-Dokument ein. Solche
Logos liegen als PNG- oder JPEG-Grafiken in einer DB. Sie
können auch Schriftzüge enthalten(z.B. Name einer Firma).

Nun das Problem: Werden Bitmaps mit Schriftzug relativ
"klein skaliert", erscheinen sie in Word verschwommen.

Zeige ich ein skaliertes Bitmap hingegen direkt in einer Form
via Picture Box an, sieht's ganz gut aus.

Ich habe diverse Skalierungs-Varianten ausprobiert, aber keine
kann den Qualitàtsverlust mindern (s. angehàngtes Beispiel).

Habt ihr ein paar Skalierungs-Tipps auf Lager?

Für eure Antworten im Voraus vielen Dank.
Bernd

Beispiel:
Private Function ScaleBitmap(ByVal pBitmap As Bitmap, _
ByVal pScaleFactor As Single) As Bitmap

Dim BmpScaled As Bitmap
With pBitmap
BmpScaled = New Bitmap(CInt(.Width * pScaleFactor), _
CInt(.Height * pScaleFactor), _
pBitmap.PixelFormat)
'BmpScaled = New Bitmap(CInt(.Width * pScaleFactor), _
' CInt(.Height * pScaleFactor), _
' PixelFormat.Format24bppRgb)
End With

Using GR As Graphics = Graphics.FromImage(BmpScaled)
GR.InterpolationMode = Drawing2D.InterpolationMode.HighQualityBicubic
GR.ScaleTransform(pScaleFactor, pScaleFactor)
Dim RectDest As Rectangle = New Rectangle(0, 0, pBitmap.Width,
pBitmap.Height)
GR.DrawImage(pBitmap, RectDest, RectDest, GraphicsUnit.Pixel)
End Using

' Restore old format.
ScaleBitmap = Me.ConvertBitmap(BmpScaled, pBitmap.RawFormat)

End Function
 

Lesen sie die antworten

#1 Karsten Sosna
14/02/2010 - 09:33 | Warnen spam
Private Function ScaleBitmap(ByVal pBitmap As Bitmap, _
ByVal pScaleFactor As Single) As Bitmap

Dim BmpScaled As Bitmap
With pBitmap
BmpScaled = New Bitmap(CInt(.Width * pScaleFactor), _
CInt(.Height * pScaleFactor), _
pBitmap.PixelFormat)
'BmpScaled = New Bitmap(CInt(.Width * pScaleFactor), _
' CInt(.Height * pScaleFactor), _
' PixelFormat.Format24bppRgb)
End With

Using GR As Graphics = Graphics.FromImage(BmpScaled)
GR.InterpolationMode = Drawing2D.InterpolationMode.HighQualityBicubic
GR.ScaleTransform(pScaleFactor, pScaleFactor)
Dim RectDest As Rectangle = New Rectangle(0, 0, pBitmap.Width,
pBitmap.Height)
GR.DrawImage(pBitmap, RectDest, RectDest, GraphicsUnit.Pixel)
End Using

' Restore old format.
ScaleBitmap = Me.ConvertBitmap(BmpScaled, pBitmap.RawFormat)

End Function



Hallo Bernd,
nettes Beispiel dafür wie man es nicht tun sollte. Nicht das Graphics-Objekt
skalieren sondern die Ausgabe, siehe Überladungen zu DrawImage:
Graphics.DrawImage-Methode (Image, Rectangle, Rectangle, GraphicsUnit)
Graphics.DrawImage-Methode (Image, RectangleF, RectangleF, GraphicsUnit)

BTW: Beachte das Du das beste Ergebnis erzielst wenn a) das Seitenverhàltnis
gleich bleibt, b) die Skalierung einen Faktor von 2^n entspricht und c)
keine Verkleinerung vorliegt. Im letzteren Fall erhöht man dann die Anzahl
der DotsPerInchs(dpi) der Zielgrafik. Damit wird die physikalisches Größe
verringert ohne das die Qualitàt der Grafik leidet, da alle
Bildinformationen erhalten bleiben.
Gruß Scotty

Ähnliche fragen