ahstax
Goto Top

Farbraum bzw Farbmodell eines Bildes herausfinden bzw ändern

Hallo,

ich bin dabei ein Programm zu schreiben, mit dem Bilddateien (jpg, bmp, tif, png) "analysiert" und ggf konvertiert werden sollen.
Die Analyse soll unter anderem den Farbraum/das Farbmodell (RGB, CMYK, YCbCr, ggf weitere) umfassen, der/das bei dem Bild angewendet ist.

Mit
strPixelFormat = imgBild.PixelFormat
erhalte ich zwar einen Wert (bsp "Format24bppRgb {137224}"), der ist aber interessanterweise(?) bei Bildern aus dem Farbraum RGB und YCbCr gleich.

Kann mir bitte jemand sagen, wie ich zuverlässig und eindeutig den verwendeten Farbraum eines Bildes herausfinde?

Neugierige Grüße,
Andreas

Content-Key: 236846

Url: https://administrator.de/contentid/236846

Printed on: April 18, 2024 at 06:04 o'clock

Member: colinardo
Solution colinardo Apr 30, 2014 updated at 10:39:53 (UTC)
Goto Top
Member: ahstax
ahstax Apr 30, 2014 at 10:39:48 (UTC)
Goto Top
Gar nicht schlecht, vielen Dank!!! :D
Member: colinardo
colinardo Apr 30, 2014 updated at 10:45:38 (UTC)
Goto Top
Falls du es in VB.Net benötigst:

Imports System.Drawing.Imaging

    Public Enum ImageColorFormat
        Rgb
        Cmyk
        Indexed
        Grayscale
    End Enum

    Function GetImageColorFormat(bm As Bitmap) As ImageColorFormat
        Const pixelFormat32bppCMYK As Integer = &H200F
        Dim flags As ImageFlags = bm.Flags

        If flags.HasFlag(ImageFlags.ColorSpaceCmyk) Or flags.HasFlag(ImageFlags.ColorSpaceYcck) Then
            Return ImageColorFormat.Cmyk
        ElseIf flags.HasFlag(ImageFlags.ColorSpaceGray) Then
            Return ImageColorFormat.Grayscale
        End If

        Select Case bm.PixelFormat
            Case pixelFormat32bppCMYK
                Return ImageColorFormat.Cmyk
            Case PixelFormat.Format16bppGrayScale
                Return ImageColorFormat.Grayscale
            Case PixelFormat.Indexed
                Return ImageColorFormat.Indexed
        End Select

        'default is rgb  
        Return ImageColorFormat.Rgb
    End Function
Grüße Uwe
Member: ahstax
ahstax Apr 30, 2014 updated at 11:34:06 (UTC)
Goto Top
Hallo Uwe,
hallo miteinander,

vielen Dank für Deine Übersetzung. Ich hatte ein sehr ähnliches Ergebnis hier erhalten.

Woran könnte es denn liegen, dass der Farbraum YcbcrK (Ycck) als CMYK und der Farbraum Ycbcr als RGB (trotz der Anpassungen, s.u.) erkennt wird?

 Public Enum ImageColorFormat
        Rgb
        Cmyk
        YccK
        Ycbcr
        Indexed
        Grayscale
    End Enum


    Public Function GetColorFormat(ByVal BM As Bitmap) As ImageColorFormat
        Const pixelFormatIndexed As Integer = 65536
        Const pixelFormat32bppCMYK As Integer = 8207
        Const pixelFormat16bppGrayScale As Integer = (4 Or (16 + 8))
        ' Check image flags  
        Dim flags = CType(BM.Flags, ImageFlags)
        If flags.HasFlag(ImageFlags.ColorSpaceCmyk) Then
            Return ImageColorFormat.Cmyk
        ElseIf flags.HasFlag(ImageFlags.ColorSpaceYcck) Then
            Return ImageColorFormat.YccK
        ElseIf flags.HasFlag(ImageFlags.ColorSpaceYcbcr) Then
            Return ImageColorFormat.Ycbcr
        ElseIf flags.HasFlag(ImageFlags.ColorSpaceGray) Then
            Return ImageColorFormat.Grayscale
        End If
        ' Check pixel format  
        Dim pixelFormat = CType(BM.PixelFormat, Integer)
        If (pixelFormat = pixelFormat32bppCMYK) Then
            Return ImageColorFormat.Cmyk
        ElseIf ((pixelFormat And pixelFormatIndexed) <> 0) Then
            Return ImageColorFormat.Indexed
        ElseIf (pixelFormat = pixelFormat16bppGrayScale) Then
            Return ImageColorFormat.Grayscale
        End If
        ' Default to RGB  
        Return ImageColorFormat.Rgb
    End Function
Member: colinardo
colinardo Apr 30, 2014 updated at 12:32:13 (UTC)
Goto Top
ohne dein Bild jetzt hier zu haben mit dem du testest, kommentiere mal Zeile 36 aus, dann kannst du prüfen ob überhaupt eine der Bedingung für dein Bild zutrifft...sollte dann nichts zurückgeben bzw. eine Exception auswerfen.
Member: ahstax
ahstax Apr 30, 2014 at 12:42:17 (UTC)
Goto Top
Wenn ich das Ycbcr-Bild im Debug mit Einzelschritten durchlaufen lasse, ist in "flags" der Wert
"ImageFlags.ColorSpaceRgb Or ImageFlags.HasRealDpi Or ImageFlags.HasRealPixelSize Or ImageFlags.ReadOnly"
und beim pixelFormat
"137224" (=RGB)

Beim YcbcrK-Bild den Wert
"ImageFlags.ColorSpaceRgb Or ImageFlags.HasRealPixelSize Or ImageFlags.ReadOnly"
und beim pixelFormat
"8207" (=CMYK)

Die auskommentierte Zeile 36 bringt keinen Fehler bzw den Wert "0"
Aufgerufen wird die Funktion bei mir mit
Dim imgBild As Image
 fsOriginalBild = IO.File.OpenRead(PfadBildDatei)
 imgBild = Image.FromStream(fsOriginalBild)
 MsgBox(GetColorFormat(imgBild))

Die fraglichen Bilddateien habe ich mit dem FastStone Imageviewer erstellt. Darin wird mir auch angezeigt, was ich eingestellt hatte. Kann ich irgendwie prüfen, ob die Einstellungen von FastStone tatsächlich den gewünschten entsprechen?
Member: colinardo
colinardo Apr 30, 2014 updated at 12:48:29 (UTC)
Goto Top
mach mal aus Zeile 04:
MsgBox(GetColorFormat(imgBild).toString())
dann wird dir das Format anstatt als Integer des Enums als String angezeigt.

Kann ich irgendwie prüfen, ob die Einstellungen von FastStone tatsächlich den gewünschten entsprechen?
Noch einen anderen Image-Viewer zur Kontrolle benutzen (z.B. Irfanview).