Расшифровать и зашифровать частный тег VCGT

  • Автор темы Автор темы mihas
  • Дата начала Дата начала

mihas

Топикстартер
15 лет на форуме
Сообщения
4 860
Реакции
2 882
Вот ведь задачка, кривые профиля в теге VCGT, которые грузятся в видеокарту, парсятся в непонятном формате, выглядят так примерно:
Код:
<PrivateType>
      <TagSignature>vcgt</TagSignature>
      <UnknownData>
       000000000000000000030100000200000225044b066a08a20ac40ccc0ebe10ab
       124a13a114d815e91723184b19671a791b851c8a1d8c1e891f82207621682256
       2341242a251125f626da27bd289e297f2a5e2b3b2c1a2cf92dda2ebc2f9f3083
       3168325033393423350f35fd36ec37dc38ce39c03aac3b9b3c8b3d7b3e6b3f5b
       404b413a42294318440744f645e546d447c448b349a24a924b824c734d644e55
       4f48503a512d52215315540a54ff55f556ec57e458db59d35aca5bbc5ca95d99
       5e8d5f84607a616f62646357644a653c662d671e680e68fe69ed6adb6bca6cb8
       6da66e946f82706f715d724b733974277516760576f477e478d479c47ab57ba6
       7c977d897e7b7f6e806081528244833584258515860486f287e088ce89bc8aa9
       8b968c838d718e5e8f4b903991279216930593f594e595d696c797ba98ad99a1
       9a969b8c9c849d7c9e769f70a06da16aa269a369a46aa56ca66ea771a874a977
       aa7aab7eac83ad89ae90af98b0a1b1aab2b4b3bfb4cab5d4b6dfb7e9b8f3b9fc
       bb05bc0dbd15be1cbf22c027c12bc22ec330c431c530c62ec72bc826c91eca15
       cb0bcbfeccf0cde0cececfbbd0a6d190d279d362d44ad531d619d700d7e7d8d0
       d9b9daa4db90dc7ddd6bde5bdf4ce040e135e22ce322e418e510e607e6ffe7f8
       e8f2e9eceae7ebe3ece1ede0eee2efe6f0edf1f5f2fff40bf519f628f73af84d
       f962fa79fb91fcabfdc6fee2ffff0cda0e1f0f7510d2127b13d51500160916f0
       17c21885193e19f01aae1b6b1c281ce91dad1e771f46201620e321af22792343
       240c24d4259d2665272e27f728c0298a2a532b1c2be72cb52d842e552f282ffe
       30d531af328b336a344b352d361236f837e138cd39b43a953b753c563d363e17
       3ef63fd640b6419442734351442f450d45ec46ca47a8488649644a434b214c00
       4cdf4dbf4e9f4f7f506051425223530653e954ce55b4569c5790588f59955a95
       5b895c745d5a5e405f24600860ea61cc62ac638d646d654d662d670d67ed68cc
       69ab6a8b6b6a6c4a6d2a6e0a6eeb6fcc70ae7190727273557439751d760376e9
       77cf78b6799e7a877b707c5b7d467e317f1d800980f681e282ce83b984a3858c
       8675875e8846892e8a158afc8be38cca8db18e988f7f9065914c9234931b9402
       94ea95d396bb97a5988f99799a659b519c3f9d2e9e1e9f12a009a103a201a302
       a406a50ba60fa714a817a919aa19ab19ac16ad13ae0faf0cb009b105b201b2fe
       b3f9b4f5b5f0b6ebb7e6b8e0b9d9bad2bbcabcc1bdb8beadbfa2c095c187c277
       c366c453c53fc629c712c7f9c8dec9c1caa2cb82cc61cd3fce1ccef9cfd5d0b0
       d18cd268d345d423d502d5e3d6c5d7a9d88ed975da5fdb4bdc3add2bde1fdf15
       e00ce106e202e2fee3fbe4f9e5f7e6f6e7f4e8f2e9f0eaeeebececeaede8eee6
       efe4f0e1f1def2dbf3d7f4d3f5cf0000020103fc05f007e309de0bd00daf0f7d
       1127128013ac14a515c916d917db18d119bf1aa81b8d1c6e1d4c1e281f021fda
       20b021852259232b23fd24ce259e266f273f280e28de29ae2a7e2b4f2c212cf4
       2dc92e9e2f75304d3126320132dc33b9349735753650372f380f38ed39cb3aa8
       3b843c603d3b3e163ef03fca40a3417b4253432b440344db45b3468b4764483c
       491549ee4ac84ba24c7d4d594e364f134ff150d051af528e53695440551355ec
       56ca57ad589059745a595b3e5c245d095dee5ed15fb460956176625563346412
       64ef65cc66a86784685e69396a136aec6bc66ca06d796e526f2b700570de71b7
       7290736a7443751d75f776d177ab788679617a3d7b197bf67cd47db27e917f70
       80508131821182f183d184b185918670874f882e890d89ed8acc8bab8c8a8d69
       8e498f29900990ea91cb92ad939094739557963c9721980798ed99d39ab99ba0
       9c879d6f9e589f42a02ea11ca20ba2fba3eda4dea5cfa6c0a7b1a8a1a991aa80
       ab6eac5cad49ae35af20b00bb0f5b1deb2c6b3aeb494b57ab65fb743b827b90b
       b9efbad3bbb6bc99bd7cbe5fbf43c027c10cc1f0c2d5c3bac49fc584c669c74e
       c832c915c9f7cad8cbb9cc98cd78ce56cf33d011d0f0d1d0d2b0d392d475d559
       d63ed726d80ed8f9d9e4dad0dbbddcabdd99de89df79e06ae15ce24ee340e432
       e523e614e704e7f4e8e2e9d0eabc000000000000000000000000000000000000
       0000000000000000000000
      </UnknownData>
    </PrivateType>
Точно известно, что эти данные можно представить в виде вот такого графика:
greenVCGT.png
В представленном примере в тенях около нуля программа выдала небольшую лишнюю закорючку на кривой зеленого канала, в результате глубокий черный может выглядеть на мониторе красноватым. Закорючку в тенях по зеленому каналу просто нужно убрать в приведенном примере (это новенький iMac), но basICColor на скрине делает это на редкость топорно. Очевидно, надо поправить в зеленом канале диапазон кривой от 0 до 10%, а басик позволяет лишь двинуть диапазон от 0 до 25%. Отсюда возникает необходимость нормально отредактировать эти кривые vcgt самостоятельно. И тут мы упираемся в непонятный шифр или кодировку.
Если сообща раскодируем и закодируем - я напишу простенькую бесплатную утилитку нормального редактирования этих кривых, главное понять алгоритм, как развернуть эти данные в табличный вид, и как обратно запаковать в этот частный вид. Программы-профилировщики же читают этот тег, операционные системы читают и даже подгружают это в видеокарту, значит как-то представить в табличном виде можно, но гугл мне не дал подсказок как именно.
 
Можно попробовать посмотреть в исходниках icclib from Graeme Gill.
 
  • Спасибо
Реакции: mihas
Можно попробовать посмотреть в исходниках icclib from Graeme Gill.
Спасибо, качнул: https://www.argyllcms.com/ICCLib_V2.16_src.zip Терпеливо жду теперь полной индексации содержимого исходников этой библиотеки и уж исходников Argyll заодно. Может и найду там vcgt. Это частный тег от Apple еще до 2003 года, но как-то же не относящиеся к Apple разработчики его и читают и пишут и в видеокарту грузят. Если найду алгоритм отпишусь.
 
  • Спасибо
Реакции: mihas
Да лоадер пока не очень интересен, интересно как отредактировать.
 
Что-то по теме чтения в переменные этой абракадабры есть в ICCLib, осталось разобраться, надеюсь разберусь со временем, погуглю UInt32Number что за хрень, я ж пока не пишу на C:
Код:
/* Read gamma format (eg. table or formula) from the buffer */
    p->tagType = (icmVideoCardGammaTagType)read_UInt32Number(bp+8);

    /* Read remaining gamma data based on format */
    if (p->tagType == icmVideoCardGammaTableType) {
        p->u.table.channels   = read_UInt16Number(bp+12);
        p->u.table.entryCount = read_UInt16Number(bp+14);
        p->u.table.entrySize  = read_UInt16Number(bp+16);
        if ((len-18) < sat_mul3(p->u.table.channels, p->u.table.entryCount,
                                p->u.table.entrySize)) {
            sprintf(icp->err,"icmVideoCardGamma_read: Tag too small to be legal");
            return icp->errc = 1;
        }
        if ((rv = pp->allocate(pp)) != 0) {  /* make space for table */
            icp->al->free(icp->al, buf);
            return icp->errc = rv;
        }
        /* ~~~~ This should be a table of doubles like the rest of icclib ! ~~~~ */
        pchar = (ORD8 *)p->u.table.data;
        pshort = (ORD16 *)p->u.table.data;
        for (c=0, bp=bp+18; c<p->u.table.channels*p->u.table.entryCount; c++) {
            switch (p->u.table.entrySize) {
            case 1:
                *pchar++ = read_UInt8Number(bp);
                bp++;
                break;
            case 2:
                *pshort++ = read_UInt16Number(bp);
                bp+=2;
                break;
            default:
                sprintf(icp->err,"icmVideoCardGamma_read: unsupported table entry size");
                pp->del(pp);
                icp->al->free(icp->al, buf);
                return icp->errc = 1;
            }
        }
    } else if (p->tagType == icmVideoCardGammaFormulaType) {
        if (len < 48) {
            sprintf(icp->err,"icmVideoCardGamma_read: Tag too small to be legal");
            return icp->errc = 1;
        }
        p->u.table.channels     = 3;    /* Always 3 for formula */
        p->u.formula.redGamma   = read_S15Fixed16Number(bp+12);
        p->u.formula.redMin     = read_S15Fixed16Number(bp+16);
        p->u.formula.redMax     = read_S15Fixed16Number(bp+20);
        p->u.formula.greenGamma = read_S15Fixed16Number(bp+24);
        p->u.formula.greenMin   = read_S15Fixed16Number(bp+28);
        p->u.formula.greenMax   = read_S15Fixed16Number(bp+32);
        p->u.formula.blueGamma  = read_S15Fixed16Number(bp+36);
        p->u.formula.blueMin    = read_S15Fixed16Number(bp+40);
        p->u.formula.blueMax    = read_S15Fixed16Number(bp+44);
    } else {
        sprintf(icp->err,"icmVideoCardGammaTable_read: Unknown gamma format for icmVideoCardGamma");
        icp->al->free(icp->al, buf);
        return icp->errc = 1;
    }

    icp->al->free(icp->al, buf);
    return 0;
}
 
ну, судя по названию это просто беззнаковое 32-разрядное целое число. Он читает тип гаммы из буфера, по смещению 8 от начала таблицы. Если это таблица, то читается кличество каналов, количество значений в таблице и размер значения. Потом проверочка на неверную таблицу с сообщением. Если все норм, выделяется память под таблицу и читаются значения, двойной точности, как и во всей библиотеке icclib. В зависимости от значения u.table.entrySize (1 или 2) значения в таблице могут быть 8 или 16 разрядными беззнаковыми целыми. И в буфер их чиатем, если нет ошибок. Если есть возвращаем память и завершаемся по ошибке.
Если же там формула tagType == icmVideoCardGammaFormulaType, она всегда для трех каналов, то читаем значения гаммы, минимума и масксимума для каждого канала, ну или завершаемся с ошибкой.
Если все нормально, освобождаем буфер.
Тут все просто, в принципе, правда, кусок из середины функции выдернут, чисто техническая фигня считывания таблицы/формулы. никаких расчетов здесь нет
 
Последнее редактирование:
  • Спасибо
Реакции: mihas
там где-то есть файл с define'ами, в которых поределены значения icmVideoCardGammaTagType, и потом по смещению начало таблицы+8 лежит тип этого профиля - табличный или формульный.
Другой вопрос, что я не уверен, что прям вот с этого места
Код:
000000000000000000030100000200000225044b066a08a20ac40ccc0ebe10ab
       124a13a114d815e91723184b19671a791b851c8a1d8c1e891f82207621682256
       2341242a251125f626da27bd289e297f2a5e2b3b2c1a2cf92dda2ebc2f9f3083
       3168325033393423350f35fd36ec37dc38ce39c03aac3b9b3c8b3d7b3e6b3f5b
       404b413a42294318440744f645e546d447c448b349a24a924b824c734d644e55
       4f48503a512d52215315540a54ff55f556ec57e4
начинаются именно те данные, что она читает, т.е. что bp+0 == 0. Неплохо бы глянуть текст всей функции
 
Последнее редактирование:
  • Спасибо
Реакции: mihas
Неплохо бы глянуть текст всей функции
Это была цитата из файла icc.c, который я скачал по ссылке https://www.argyllcms.com/ICCLib_V2.16_src.zip, внутри файла поиском vcgt. Мне с непривычки сложновато код на C читать, я годами пялюсь только в php и javascript, потому и цитата не вся. Пока понял что немного отложу, но если вам интересно - вот идея: скомпилировать простенькую программу - на входе вот вся эта "абракадабра" из тега vcgt хоть текстовым файлом, на выходе таблицы. И снова на входе таблицы - на выходе абракадабра. Калибровщики мониторов сказали бы вам спасибо, если скомпилировать не только под виндовс - можно к юниксовым сервакам прикручивать, словом было бы крайне полезное дополнение к утилите ICCXML, она что-то давненько не обновлялась. калибровщики мониторов оценили бы шарм. Уж с табличкой из трех кривых справимся как ее поредактировать. Здесь ведь именно стоит задача поредактировать кривые и это актуально, Леша Шадрин восторгался басикколором, что он умеет двинуть черную точку кривой из тега vcgt, а мне не понятно зачем восторг, если басик двигает кривую совершенно топорно и куда лучше можно поправить даже просто предоставив пользователю возможность в экселе поправить табличку и запаковать ее обратно в vcgt, и то будет лучше и точнее, чем в basiccolor.
 
Да нет, писать-то я точно не буду а) нет времени - новый год на носу, б) лень. Мой С,/С++, в основном, для контроллеров, разбираться с кросс-платформенными приложениями мне чет не очень хочется. Просто здесь нормально (не считая switch'а и некоторых констант, заданных прям в тексте), самодокументированно написан текст функции, поэтому и читается прям легко. Взглянуть и поумничать я готов, но работать по этой теме - нет :)
 
  • Спасибо
Реакции: mihas
И сколько потенциальных пользователей у этой простенькой программки?
 
Берем число откалиброванных мониторов, берем от них тот большой процент, где черная точка прописана неправильно в vcgt - вот и число пользователей. Или это практически половина пользователей, откалибровавшие монитор профайлером от иксрайт, проблемка то не частного, а системного характера. Прибор может ошибаться в замере черной точки, эту проблему кое как решают, используя ли аржил, исправляя ли кривую в basic - я предлагаю еще одно решение.
 
Я не столь оптимистичен в прогнозах, потому и не вижу пока смысла в написании этой незамысловатой софтины. Тем более, что код уже написан и осталось лишь его переиспользовать, либо переписать на другой яп и обернуть по вкусу.
 
Сложного там ничего нет, никакой криптографии.
Какой то хедер (судя по всему всегда одинаковый, если размер тэга постоянный), 3 раза по 1024 байта - RGB каналы, добитие до какого то фиксированного размера нулями.

В каналых кодирование тупо 4 байта на цифру, big-endian, подряд только значения Y. Значений X нет, они идут подряд от 0 до 255. Собственно, все.

Вот, я на блоки побил:
Это хедер:
0000000000000000000301000002

Это блок RED:
00000225044b066a08a20ac40ccc0ebe10ab
124a13a114d815e91723184b19671a791b851c8a1d8c1e891f82207621682256
2341242a251125f626da27bd289e297f2a5e2b3b2c1a2cf92dda2ebc2f9f3083
3168325033393423350f35fd36ec37dc38ce39c03aac3b9b3c8b3d7b3e6b3f5b
404b413a42294318440744f645e546d447c448b349a24a924b824c734d644e55
4f48503a512d52215315540a54ff55f556ec57e458db59d35aca5bbc5ca95d99
5e8d5f84607a616f62646357644a653c662d671e680e68fe69ed6adb6bca6cb8
6da66e946f82706f715d724b733974277516760576f477e478d479c47ab57ba6
7c977d897e7b7f6e806081528244833584258515860486f287e088ce89bc8aa9
8b968c838d718e5e8f4b903991279216930593f594e595d696c797ba98ad99a1
9a969b8c9c849d7c9e769f70a06da16aa269a369a46aa56ca66ea771a874a977
aa7aab7eac83ad89ae90af98b0a1b1aab2b4b3bfb4cab5d4b6dfb7e9b8f3b9fc
bb05bc0dbd15be1cbf22c027c12bc22ec330c431c530c62ec72bc826c91eca15
cb0bcbfeccf0cde0cececfbbd0a6d190d279d362d44ad531d619d700d7e7d8d0
d9b9daa4db90dc7ddd6bde5bdf4ce040e135e22ce322e418e510e607e6ffe7f8
e8f2e9eceae7ebe3ece1ede0eee2efe6f0edf1f5f2fff40bf519f628f73af84d
f962fa79fb91fcabfdc6fee2ffff

Это блок GREEN:
0cda0e1f0f7510d2127b13d51500160916f0
17c21885193e19f01aae1b6b1c281ce91dad1e771f46201620e321af22792343
240c24d4259d2665272e27f728c0298a2a532b1c2be72cb52d842e552f282ffe
30d531af328b336a344b352d361236f837e138cd39b43a953b753c563d363e17
3ef63fd640b6419442734351442f450d45ec46ca47a8488649644a434b214c00
4cdf4dbf4e9f4f7f506051425223530653e954ce55b4569c5790588f59955a95
5b895c745d5a5e405f24600860ea61cc62ac638d646d654d662d670d67ed68cc
69ab6a8b6b6a6c4a6d2a6e0a6eeb6fcc70ae7190727273557439751d760376e9
77cf78b6799e7a877b707c5b7d467e317f1d800980f681e282ce83b984a3858c
8675875e8846892e8a158afc8be38cca8db18e988f7f9065914c9234931b9402
94ea95d396bb97a5988f99799a659b519c3f9d2e9e1e9f12a009a103a201a302
a406a50ba60fa714a817a919aa19ab19ac16ad13ae0faf0cb009b105b201b2fe
b3f9b4f5b5f0b6ebb7e6b8e0b9d9bad2bbcabcc1bdb8beadbfa2c095c187c277
c366c453c53fc629c712c7f9c8dec9c1caa2cb82cc61cd3fce1ccef9cfd5d0b0
d18cd268d345d423d502d5e3d6c5d7a9d88ed975da5fdb4bdc3add2bde1fdf15
e00ce106e202e2fee3fbe4f9e5f7e6f6e7f4e8f2e9f0eaeeebececeaede8eee6
efe4f0e1f1def2dbf3d7f4d3f5cf

Это блок BLUE:
0000020103fc05f007e309de0bd00daf0f7d
1127128013ac14a515c916d917db18d119bf1aa81b8d1c6e1d4c1e281f021fda
20b021852259232b23fd24ce259e266f273f280e28de29ae2a7e2b4f2c212cf4
2dc92e9e2f75304d3126320132dc33b9349735753650372f380f38ed39cb3aa8
3b843c603d3b3e163ef03fca40a3417b4253432b440344db45b3468b4764483c
491549ee4ac84ba24c7d4d594e364f134ff150d051af528e53695440551355ec
56ca57ad589059745a595b3e5c245d095dee5ed15fb460956176625563346412
64ef65cc66a86784685e69396a136aec6bc66ca06d796e526f2b700570de71b7
7290736a7443751d75f776d177ab788679617a3d7b197bf67cd47db27e917f70
80508131821182f183d184b185918670874f882e890d89ed8acc8bab8c8a8d69
8e498f29900990ea91cb92ad939094739557963c9721980798ed99d39ab99ba0
9c879d6f9e589f42a02ea11ca20ba2fba3eda4dea5cfa6c0a7b1a8a1a991aa80
ab6eac5cad49ae35af20b00bb0f5b1deb2c6b3aeb494b57ab65fb743b827b90b
b9efbad3bbb6bc99bd7cbe5fbf43c027c10cc1f0c2d5c3bac49fc584c669c74e
c832c915c9f7cad8cbb9cc98cd78ce56cf33d011d0f0d1d0d2b0d392d475d559
d63ed726d80ed8f9d9e4dad0dbbddcabdd99de89df79e06ae15ce24ee340e432
e523e614e704e7f4e8e2e9d0eabc

Финальные нули:
000000000000000000000000000000000000
0000000000000000000000

Например, у тебя на Грине при входном нуле на графике идет сразу 5%.
Смотрим - у грина в таблице для нуля 0cda (hex), то есть 3290 в десятичном представлении, это будет как раз 3290/65535=0.05 или 5%.
65535 это FFFF (hex).
Смотрим на график RED последняя точка максимальна. Смотрим в таблицу для RED - так и есть, FFFF.
Ну и т.д.

Так что редактировать такую штуку можно запросто.
 
  • Спасибо
Реакции: mihas
Леша, все понял, вот так мне гораздо понятнее как ты показал! Ты эту таблицу препарировал, мне осталось только простой скрипт написать. Попробую! Я не пробовал пока 4 байта на цифру, big-endian преобразовывать в 16-битные числа, но думаю найду чего-нибудь стандартное для такой конверсии. Спасибо!
 
4 символа вырезал из строки, - в число преобразовал.
для js -
JavaScript:
function hexToDec (hex){ return parseInt(hex,16); }
поделал что нужно и
JavaScript:
function decToHex(n){ return Number(n).toString(16); }
, в строчки собрал, в файл сохранил
 
Последнее редактирование:
  • Спасибо
Реакции: mihas
Спасибо! Все просто и понятно с помощью коллег!
Вот по вашим подсказкам табличка красного канала этих данных в процентах:

0.00 0.84 1.68 2.51 3.37 4.21 5.00 5.76 6.51 7.14 7.67 8.14 8.56 9.04 9.49 9.92 10.34 10.75 11.15 11.54 11.93 12.31 12.68 13.05 13.41 13.77 14.13 14.48 14.83 15.18 15.52 15.87 16.21 16.55 16.89 17.23 17.57 17.91 18.26 18.60 18.95 19.30 19.65 20.01 20.37 20.73 21.09 21.45 21.82 22.19 22.56 22.92 23.28 23.65 24.02 24.38 24.75 25.11 25.48 25.84 26.21 26.57 26.94 27.30 27.67 28.03 28.40 28.76 29.13 29.50 29.86 30.23 30.60 30.97 31.34 31.71 32.08 32.45 32.83 33.20 33.58 33.95 34.33 34.71 35.09 35.47 35.83 36.20 36.56 36.93 37.31 37.69 38.06 38.43 38.81 39.18 39.55 39.91 40.28 40.65 41.01 41.38 41.74 42.11 42.47 42.83 43.20 43.56 43.92 44.28 44.65 45.01 45.37 45.74 46.10 46.47 46.83 47.20 47.57 47.93 48.30 48.67 49.04 49.41 49.78 50.15 50.52 50.89 51.25 51.62 51.99 52.35 52.71 53.08 53.44 53.80 54.16 54.53 54.89 55.25 55.61 55.97 56.34 56.70 57.07 57.43 57.80 58.16 58.53 58.90 59.27 59.64 60.01 60.39 60.76 61.14 61.52 61.90 62.28 62.67 63.05 63.44 63.83 64.23 64.62 65.01 65.41 65.80 66.20 66.59 66.99 67.39 67.79 68.19 68.59 69.00 69.40 69.81 70.21 70.62 71.03 71.44 71.84 72.25 72.65 73.06 73.46 73.86 74.26 74.66 75.06 75.46 75.85 76.25 76.64 77.03 77.42 77.80 78.18 78.56 78.94 79.31 79.69 80.05 80.42 80.78 81.15 81.50 81.86 82.22 82.57 82.93 83.28 83.63 83.99 84.34 84.69 85.05 85.41 85.77 86.13 86.49 86.86 87.23 87.60 87.97 88.35 88.73 89.10 89.48 89.86 90.23 90.61 91.00 91.38 91.76 92.14 92.53 92.92 93.32 93.71 94.11 94.52 94.92 95.33 95.74 96.16 96.57 96.99 97.42 97.84 98.27 98.70 99.13 99.57 100.00

Дооформлю и выложу в открытый доступ. Тащи себе в Эксель, правь как хочешь, потом запаковывай обратно в 16битное представление hex в нужном порядке, все что требовалось собственно.
Делов на 5 минут а польза при хорошей калибровке монитора большая. Я не потому пишу такие утилитки, что у них будет 100500 миллионов пользователей, а просто потому, что решение любой задачи поднимает твой профессиональный уровень. Здесь решил быстро и просто на простом примере, завтра уже не будет проблем решить на сложном примере более сложную задачу.
Всем спасибо за помощь! Реально сообща моментально сделали.
 
В принципе не откладывая в долгий ящик допилил запаковщик и распаковщик vcgt, простенькая утилитка с открытым кодом, огромное спасибо всем за полезные подсказки:
Редактирование пока в эксель - это самый творческий подход и мне он наиболее удобен, утилита распаковывает и запаковывает. Осталось протестировать все эти оффсеты в профиле и кол-во нулей в конце vcgt, сходу IccXML у меня запаковал с каким-то сдвигом, надо выяснить что не так уже при упаковке в icc и сделать инструкцию по применению. Может еще какой hex-редактор задействовать помимо IccXML. Поэкспериментирую.
На картинке - как красиво можно зеленый канал в черном поправить просто в табличном редакторе, basiccolor по сравнению с этим - просто чудовище неаккуратное!-))) В примере vcgt от иксрайта, монитор iMac большой.
 

Вложения

  • vcgtedit.png
    vcgtedit.png
    16.8 КБ · Просм.: 225
  • Спасибо
Реакции: ~RA~
Протестировал наконец. У IccXML нет проблемы с распаковкой профиля монитора, но есть некоторые проблемы с запаковкой. Сильная прога, и профили фотиков мне паковала нормально, и уж тем более профили цветоделения нормально, а тут с мониторами малость не дружит. Короче, как надо обратно тег vcgt не пакует. Взял hex-редактор, любой, я качнул первый попавшийся Hex Editor Neo, минут 10 в нем освоился, определил начало и конец vcgt побайтно, вырезал, вставил свой vcgt, снова сравнил начало и конец - без сдвигов, ок, там же поправил пару символов в desc чтобы имя профиля для программ не совпадало со старым профилем, сохранил с этим именем - полет нормальный, кривые в видеокарту подгрузились. Убрал из vcgt-эдитора разбивку на строки как после IccXML опционально, чтобы напрямую побитно записывать. Напишу инструкцию и можно красиво калибровать мониторы, это не основной заработок вовсе для полиграфиста, но так бывает обращаются и с монитором, чего ж не сделать, если спектрофотометр есть, главный инструмент в ИП. Спасибо всем за помощь в создании полезной утилитки.
 

Вложения

  • vcgt_b1_b2.png
    vcgt_b1_b2.png
    44.8 КБ · Просм.: 219