Если эта функция делает то, что я думаю, то кажется, что на моей машине по крайней мере в CMYK C=0, M=0, Y=0 и K=0 не соответствует белому! В чем проблема?
float *arr
— это массив с плавающей запятой, состоящий из size
элементов. Я хочу сохранить этот массив в формате JPEG с libjpeg IJG в двух цветовых пространствах по требованию: g
: Шкала серого и c
: CMYK. Я следую их примеру и делаю входной массив JSAMPLE *jsr
с количеством JSAMPLE
элементов в зависимости от цветового пространства: size
элементов для шкалы серого и 4*size
элементов для CMYK. JSAMPLE
— это просто другое имя для unsigned char
, по крайней мере, на моей машине. Полную программу можно увидеть на Github. Вот как я заполняю jsr
:
void
floatfilljsarr(JSAMPLE *jsr, float *arr, size_t size, char color)
{
size_t i;
double m;
float min, max;
/* Find the minimum and maximum of the array:*/
fminmax(arr, size, &min, &max);
m=(double)UCHAR_MAX/((double)max-(double)min);
if(color=='g')
{
for(i=0;i<size;i++)
jsr[i]=(arr[i]-min)*m;
}
else
for(i=0;i<size;i++)
{
jsr[i*4+3]=(arr[i]-min)*m;
jsr[i*4]=jsr[i*4+1]=jsr[i*4+2]=0;
}
}
Я должен отметить, что color
перед этой функцией было проверено либо на c
, либо на g
. Затем я записываю изображение в формате JPEG точно так же, как программа example.c
в исходном коде libjpeg
.
Вот результат после печати обоих изображений в документе TeX. Оттенки серого слева, а CMYK справа. Оба изображения сделаны из одного и того же упорядоченного массива, поэтому нижний левый элемент (первый в массиве, как я его определил и отобразил здесь) имеет значение JSAMPLE 0, а верхний правый элемент имеет значение JSAMPLE 255.
Почему эти два изображения не похожи? Из-за другой природы я ожидаю, что изображение CMYK будет перевернутым: его нижняя часть будет яркой, а верхняя - черной. Их отображаемые значения JSAMPLE (единственное значение в оттенках серого и канал K в CMYK) идентичны, но я получаю не то, что ожидал! Изображение CMYK также ярче кверху, но очень слабо!
Кажется, что C=0, M=0, Y=0 и K=0 не соответствуют белому по крайней мере с этим алгоритмом и на моей машине!?! Как я могу установить белый цвет, когда мне нужно изменить только канал K, а остальные оставить равными нулю?