2010-10-19 43 views
2

Je me demande s'il est possible de demander au codeur PNG d'imagerie de ne pas ajouter d'informations de gamma et de chrominance à un PNG 1 bit.Empêcher l'encodeur GDI + PNG d'ajouter des informations gamma à un PNG 1 bit

Je crée une palette de 2 couleurs pour l'image

ColorPalette* pal = (ColorPalette*)CoTaskMemAlloc(sizeof(ColorPalette) + 2 * sizeof(ARGB)); 
pal->Count = 2; 
pal->Flags = 0; 
pal->Entries[0] = MAKEARGB(0,0,0,0); 
pal->Entries[1] = MAKEARGB(0,255,255,255); 
if (FAILED(res = sink->SetPalette(pal))) { 
    return res; 
} 
CoTaskMemFree(pal); 

et puis juste

BitmapData bmData; 
bmData.Height = bm.bmHeight; 
bmData.Width = bm.bmWidth; 
bmData.Scan0 = bm.bmBits; 
bmData.PixelFormat = PixelFormat1bppIndexed; 

UINT bitsPerLine = imageInfo.Width * bm.bmBitsPixel; 
UINT bitAlignment = sizeof(LONG) * 8; 
UINT bitStride = bitAlignment * (bitsPerLine/bitAlignment); // The image buffer is always padded to LONG boundaries 
if ((bitsPerLine % bitAlignment) != 0) bitStride += bitAlignment; // Add a bit more for the leftover values 
    bmData.Stride = bitStride/8; 

if (FAILED(res = sink->PushPixelData(&rect, &bmData, TRUE))) { 
    return res; 
} 

L'image résultante PNG est une façon de grand et contient les en-têtes inutiles suivants:

sRGB, gAMA, cHRM

Je n'attendais que PLTE et non sRGB. Comment dois-je configurer l'encodeur pour ignorer les calculs de gamma et de chrominance?

Répondre

0

Je suis également intéressé de savoir si c'est possible. J'utilise gdi + dans un programme C++ pour générer des png pour un site web et les png ont des couleurs différentes de celles du css bien que je mette exactement les mêmes valeurs. En supprimant les trucs sRGB, cela pourrait résoudre le problème gamma dans la plupart des navigateurs.

J'espère qu'il y a une solution pour cela!

+0

Pas encore de réponse de MS :(Etant donné que toutes ces données MS sont des sources fermées, nous ne sommes pas en mesure de vérifier pourquoi elles ont créé ce segment sRGB – philk

0

J'ai résolu cela en implémentant la bibliothèque FreeImage (http://freeimage.sourceforge.net/).

Je crée le bitmap avec GDI +, je verrouille ses pixeldata, crée un bitmap freeimage, le verrouille aussi et copie les pixels.

Ensuite, je fais de freeimage l'enregistrer dans un fichier PNG et voila ... informations gamma correctes, bonnes dans tous les navigateurs.

C'est un peu plus frais (bien que j'ai l'impression que FreeImage enregistre les images beaucoup plus rapidement que GDI +, ce qui rend le processus global encore plus rapide). Mais bien sûr, vous aurez besoin d'une bibliothèque supplémentaire avec dll avec votre projet.

+0

J'ai oublié de mentionner que je suis sur la plate-forme Windows CE et je ne veux pas dépendre de bibliothèques externes en fait, mais je vais regarder, merci! – philk