Re[4]: microsoft ICM сконвертить в La*b*
От: Аноним  
Дата: 23.05.05 12:52
Оценка:
Здравствуйте, 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);
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.