.net - por - Cómo identificar imágenes CMYK usando C#
el mejor buscador de imagenes (3)
Los resultados de mi prueba son un poco diferentes a los tuyos.
- Windows 7:
- ImageFlags: ColorSpaceRgb
- PixelFormat: PixelFormat32bppCMYK (8207)
- Windows Server 2008 R2:
- ImageFlags: ColorSpaceRgb
- PixelFormat: PixelFormat32bppCMYK (8207)
- Windows Server 2008:
- ImageFlags: ColorSpaceYcck
- PixelFormat: Format24bppRgb
El siguiente código debería funcionar:
public static bool IsCmyk(this Image image)
{
var flags = (ImageFlags)image.Flags;
if (flags.HasFlag(ImageFlags.ColorSpaceCmyk) || flags.HasFlag(ImageFlags.ColorSpaceYcck))
{
return true;
}
const int PixelFormat32bppCMYK = (15 | (32 << 8));
return (int)image.PixelFormat == PixelFormat32bppCMYK;
}
¿Alguien sabe cómo identificar correctamente las imágenes CMYK utilizando C #? Descubrí cómo hacerlo utilizando ImageMagick, pero necesito una solución .NET. Encontré 3 fragmentos de código en línea, solo uno funciona en Windows 7, pero todos fallan en Windows Server 2008 SP2. Necesito que funcione al menos en Windows Server 2008 SP2. Esto es lo que he encontrado:
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Drawing;
using System.Drawing.Imaging;
bool isCmyk;
// WPF
BitmapImage wpfImage = new BitmapImage(new Uri(imgFile));
// false in Win7 & WinServer08, wpfImage.Format = Bgr32
isCmyk = (wpfImage.Format == PixelFormats.Cmyk32);
// Using GDI+
Image img = Image.FromFile(file);
// false in Win7 & WinServer08
isCmyk = ((((ImageFlags)img.Flags) & ImageFlags.ColorSpaceCmyk) ==
ImageFlags.ColorSpaceCmyk);
// true in Win7, false in WinServer08 (img.PixelFormat = Format24bppRgb)
isCmyk = ((int)img.PixelFormat) == 8207;
Me encontré con los mismos problemas y si usas .net 2.0, entonces BitmapDecoder no funcionará ... lo que quieres hacer es leer el archivo y simplemente verificar que los bytes dicen que el archivo es ... Cómo identificar las imágenes CMYK en ASP.NET usando C # Espero que esto ayude a alguien.
Saludos - Jeremy
No comenzaría con BitmapImage como su forma de cargar los datos. De hecho, no lo usaría en absoluto para esto. En su lugar usaría BitmapDecoder::Create
y pasar en BitmapCreateOptions.PreservePixelFormat
. Luego, puede acceder al BitmapFrame
que está interesado y verificar su propiedad de Format
, que ahora debería generar CMYK.
Luego, si realmente necesita mostrar la imagen, solo puede asignar BitmapFrame
, que también es una subclase de BitmapSource
, a una Image::Source
.