Forums Neueste Beiträge
 

Hintergrundfarbe in TIFFs mit Alphakanal erhalten oder Farbe in Graphics-Objekt ersetzen

26/04/2010 - 15:52 von Georg Weisse | Report spam
Hallo Leute,

ich muss von TIFFs an der Unterkante ein Stück abschneiden.
Die TIFFs haben einen Alpha-Kanal.
Das mache ich mit unten stehender Routine (gekürzt),
funktioniert soweit auch ganz gut, auch das Speichern mit
dem TIF-Encoder klappt auf diese Art.

Bei weißen Kanten im TIFF wird aber am Rand des Alpha-Kanals
der Inhalt (255,255,255) um ein Bit dunkler (254,254,254) als
im Original, da mir der Encoder den vormals weißen Hintergrund
schwarz macht.

Ich suche also entweder:
Einen Weg die Farbe des Hintergrunds zu erhalten.
oder:
Einen Weg eine einzelne Farbe (254,254,254) durch eine andere
(255,255,255) zu ersetzen.

Ich hoffe, dass Ihr mal wieder einen tollen Tip für mich habt,
Ciao,
Georg


Private Sub Machma()
Try
Dim myEncoder As System.Drawing.Imaging.Encoder _
= System.Drawing.Imaging.Encoder.Compression

Dim myEncoderParameters As New _
System.Drawing.Imaging.EncoderParameters(1)

Dim tifEncoder As Drawing.Imaging.ImageCodecInfo _
= GetEncoder(Drawing.Imaging.ImageFormat.Tiff)

Dim myEncoderParameter As New _
System.Drawing.Imaging.EncoderParameter _
(myEncoder, Drawing.Imaging.EncoderValue.CompressionNone)

myEncoderParameters.Param(0) = myEncoderParameter

Dim myPic As New Bitmap("C:\A.tif")
Dim newPic As New Bitmap(260, 180)
Dim g As Graphics = Graphics.FromImage(newPic)

g.DrawImageUnscaled(myPic, New Point(0, 0))

newPic.Save("C:\B.tif", tifEncoder, myEncoderParameters)
Catch ex As Exception
' ...
End Try
End Sub

Private Function GetEncoder _
(ByVal format As System.Drawing.Imaging.ImageFormat) _
As System.Drawing.Imaging.ImageCodecInfo
Try
Dim codecs As System.Drawing.Imaging.ImageCodecInfo() _
= System.Drawing.Imaging.ImageCodecInfo.GetImageDecoders()

Dim codec As System.Drawing.Imaging.ImageCodecInfo

For Each codec In codecs
If codec.FormatID = format.Guid Then
Return codec
End If
Next codec

Return Nothing
Catch ex As Exception
' ...
Return Nothing
End Try
End Function
 

Lesen sie die antworten

#1 Karsten Sosna
26/04/2010 - 18:52 | Warnen spam
Dim myPic As New Bitmap("C:\A.tif")
Dim newPic As New Bitmap(260, 180)
Dim g As Graphics = Graphics.FromImage(newPic)

g.DrawImageUnscaled(myPic, New Point(0, 0))



Hallo Georg,
das funktioniert nie, solange Du nicht die Auflösung des Originals
beachtest. GDI+ interpoliert hier Farben, deswegen erhàltst Du eine
Abweichung zum Rand. Selbst die Farben innerhalb des Bildes stimmen nicht
mehr, am Rand fàllt es halt am meisten auf, da dort gegen die maximal Werte
interpoliert wird.
Abhilfe wird wohl nur BitmapData schaffen. Leider kann ich Dir kein
funktionsfàhiges Beispiel liefern, da das Tiff-Format genauso beliebt ist
wie ein Stinktier im Bett. Das liegt daran das Tiff nicht gleich Tiff ist.
Auszug u.a. Wikepedia:
"
Einschrànkungen
Größter Nachteil von TIFF ist seine Komplexitàt. Die Vielfalt möglicher
gültiger TIFF-Dateien kann von keinem einzelnen Programm unterstützt
werden."

Lass Dir mal das Pixelformat von myPic ausgeben, dann kann ich Dir
vielleicht weiter helfen.
Gruß Scotty

Ähnliche fragen