Здравствуйте, adontz, Вы писали:
A>Просто PhotoShop может сам применять какие-то ICM в процессе конвертации.
A>Лучше бы конвертировать туда-обратно и смотреть на разницу между исходным и дважды сконвертированным RGB.
Только что попробовал писать не в raw а в tiff:
TIFF *out=TIFFOpen( "lab.tif", "wb");
TIFFSetField( out, TIFFTAG_IMAGEWIDTH, w);
TIFFSetField( out, TIFFTAG_IMAGELENGTH, h);
TIFFSetField( out, TIFFTAG_ORIENTATION, ORIENTATION_BOTLEFT);
TIFFSetField( out, TIFFTAG_SAMPLESPERPIXEL, 3);
TIFFSetField( out, TIFFTAG_BITSPERSAMPLE, 8);
TIFFSetField( out, TIFFTAG_PLANARCONFIG, PLANARCONFIG_CONTIG);
TIFFSetField( out, TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_CIELAB);
TIFFSetField( out, TIFFTAG_XRESOLUTION, 72.0);
TIFFSetField( out, TIFFTAG_YRESOLUTION, 72.0);
...
for (int j=0; j<w; j++) {
buf[j*3+0] = BYTE(dcolorBuf[j].Lab.L/257.0+0.5);
buf[j*3+1] = BYTE((dcolorBuf[j].Lab.a)/257.0+0.5);
buf[j*3+2] = BYTE((dcolorBuf[j].Lab.b)/257.0+0.5);
}
TIFFWriteScanline( out, buf, i, 0);
...
TIFFClose( out);
Тут уже вроде влияния Photoshop'а должны исключиться.
Артефакты и свистопляска на гистограмме a* и b* каналов осталась как и была
Попробовал сконвертнуть туда-обратно (sRGB -> La*b* -> sRGB) на выходе получил RGB картинку с точно такими-же артефактами
что были на La*b* картинке, и тоже цвета ушли немного в зеленый. Теперь вообще не знаю что делать. Пробовал другие профили La*b*, например LCMSLABI.ICM
Привожу полный текст:
#include <stdio.h>
#include <windows.h>
#include <icm.h>
#include "tiff.h"
#include "tiffconf.h"
#include "tiffio.h"
#include "tiffvers.h"
int main (int argc, char *argv[])
{
int h=1200;
int w=1600;
COLOR *scolorBuf=new COLOR[w];
COLOR *dcolorBuf=new COLOR[w];
BYTE *dbuf=new BYTE[w*3];
unsigned char *buf=new unsigned char[w*3];
HPROFILE pr[2];
PROFILE p;
p.dwType = PROFILE_FILENAME;
p.pProfileData = "G:\\icm\\sRGB Color Space Profile.ICM";
p.cbDataSize = strlen((char*)p.pProfileData)+1;
pr[0]=OpenColorProfile( &p, PROFILE_READ, FILE_SHARE_READ, OPEN_EXISTING);
p.pProfileData = "G:\\icm\\Tifflab8spac.icm";
p.cbDataSize = strlen((char*)p.pProfileData)+1;
pr[1]=OpenColorProfile( &p, PROFILE_READ, FILE_SHARE_READ, OPEN_EXISTING);
DWORD intent=INTENT_ABSOLUTE_COLORIMETRIC;
HTRANSFORM ht=CreateMultiProfileTransform( pr, 2, &intent, 1, 0, INDEX_DONT_CARE);
HPROFILE pr_rev[2]={pr[1],pr[0]};
HTRANSFORM ht_rev=CreateMultiProfileTransform( pr_rev, 2, &intent, 1, 0, INDEX_DONT_CARE);
FILE *ifp=fopen("rgb.raw", "rb");
FILE *ofp=fopen("rgb_out.raw", "wb");
for (int i=0; i<h; i++) {
fread( buf, w, 3, ifp);
for (int j=0; j<w; j++) {
scolorBuf[j].rgb.red = buf[j*3+0]*257;
scolorBuf[j].rgb.green = buf[j*3+1]*257;
scolorBuf[j].rgb.blue = buf[j*3+2]*257;
}
TranslateColors( ht, scolorBuf, w, COLOR_RGB, dcolorBuf, COLOR_Lab);
TranslateColors( ht_rev, dcolorBuf, w, COLOR_Lab, scolorBuf, COLOR_RGB);
for (int j=0; j<w; j++) {
buf[j*3+0] = BYTE(scolorBuf[j].rgb.red/257.0+0.5);
buf[j*3+1] = BYTE(scolorBuf[j].rgb.green/257.0+0.5);
buf[j*3+2] = BYTE(scolorBuf[j].rgb.blue/257.0+0.5);
}
fwrite( buf, w, 3, ofp);
}
delete[] buf;
delete[] dcolorBuf;
delete[] scolorBuf;
fclose( ofp);
fclose( ifp);
}