LINUX.ORG.RU

Получить CMYK изображения, как получается через file.pdf через «gs -q -dNOPAUSE -dBATCH...»

 ,


0

1

Как получить такой вывод но уже от картинки. Можно ли обойтись без конвертации картинки в pdf?

gs -q -dNOPAUSE -dBATCH -dFirstPage=1 -dLastPage=1  -sDEVICE=inkcov -o - file.pdf;
★★

Последнее исправление: abbat81 (всего исправлений: 1)

Вот если из imagemagick использовать identify и посмотреть Channel Statistics в поле mean (среднее). Это не то?

$ identify -verbose -colorspace cmyk  piture.jpeg 
Zubok ★★★★★
()
Последнее исправление: Zubok (всего исправлений: 1)
Ответ на: комментарий от Zubok

Это оно, там вижу mean. Только как с форматом, что бы получить типа этого:

 0.03234  0.03234  0.03234  0.03234 CMYK OK

Ну т.е. четыре значения без ОК и CMYK

abbat81 ★★
() автор топика
Ответ на: комментарий от abbat81

Там есть опция -format у identify, но только надо почитать, можно ли как-то через нее вывести без распарсинга всего этого добра в выводе. Или, может, еще как-то можно.

Zubok ★★★★★
()
Ответ на: комментарий от abbat81

Вот так он, например, выводит среднее в десятичной форме (округлено, но, может быть, там можно формат float указать). Можно использовать математическое выражение вместе с mean, чтобы преобразовать в другой вид.

$ identify -colorspace cmyk  -format '%[pixel:mean]\n' picture.jpeg
Zubok ★★★★★
()
Ответ на: комментарий от abbat81

0.03234 0.03234 0.03234 0.03234 CMYK OK

Вот надо разобраться, как получить среднее по всей картинке. Вот так вот, например, такую строчку можно выдать:

$ identify -precision 5 -colorspace cmyk  -format \ 
'%[fx:cyan:mean]  %[fx:magenta:mean]  %[fx:yellow:mean]  \ 
%[fx:black:mean] CMYK OK\n' picture.jpeg 

0.30011  0.10857  0.35366  0 CMYK OK
$

Но это, похоже, какой-то один пиксель, что ли. В общем, это не те цифры, которые в среднем. Поэтому надо дальше рыть, но направление такое. Может быть, там в опциях можно задать, чтобы он по всей картинке прошел и тогда будет что надо.

Zubok ★★★★★
()
Последнее исправление: Zubok (всего исправлений: 3)
Ответ на: комментарий от Zubok

получаю:

identify.im6: unrecognized option `-precision' @ error/identify.c/IdentifyImageCommand/699.
а если без -precision 5 то получаю:
0 0 0 CMYK OK

abbat81 ★★
() автор топика
Ответ на: комментарий от abbat81

0 0 0 CMYK OK

Возможно, белый пиксель какой-то попался (он какое-то не то среднее считает в данном случае). Попробуй на другой картинке. То же самое будет? Нигде не ошибся случайно?

Zubok ★★★★★
()
Последнее исправление: Zubok (всего исправлений: 2)
Ответ на: комментарий от abbat81

А покажи точно, что ты вводишь? Скопируй.

Zubok ★★★★★
()
Ответ на: комментарий от abbat81

Вот так вот со средним из вывода identify, но кроме cyan почему-то. Вроде в документации написано, что он так обозначается, но число другое

identify   -colorspace cmyk  -format '%[fx:mean.сyan]  
%[fx:mean.magenta]  %[fx:mean.yellow]  %[fx:mean.black] CMYK 
OK\n' picture.jpeg

0.381174  0.357071  0.249848  0.667383 CMYK OK

Вывод c verbose. Как видно средние по MYK совпали с выводом, но cyan другой. Надо разобраться.

identify  -verbose  -colorspace cmyk  picture.jpeg  | grep "mean"

  mean: 63.8501 (0.250393) - это cyan
  mean: 91.053 (0.357071) - это magenta
  mean: 63.7113 (0.249848) - это yellow
  mean: 170.183 (0.667383) - это black
  mean: 97.1993 (0.381174) - это Image statistics.

Zubok ★★★★★
()
Ответ на: комментарий от Zubok

О. вот так работает. Ура.

identify   -colorspace cmyk  -format '%[fx:mean.c]  %[fx:mean.m]  
%[fx:mean.y]  %[fx:mean.k] CMYK OK\n' picture.jpeg 

0.250393  0.357071  0.249848  0.667383 CMYK OK
Zubok ★★★★★
()
Последнее исправление: Zubok (всего исправлений: 1)
Ответ на: комментарий от Zubok

Круто, только поймал на одной картинке такое:

0.000426554  0.152395  0.191774  0.579692 CMYK OK

Длина строки первого значения все сломает. Хотя смотря как записывать каждый цвет в переменную. По табуляции, которой там может и нет или по количеству символов.

abbat81 ★★
() автор топика
Последнее исправление: abbat81 (всего исправлений: 3)
Ответ на: комментарий от abbat81

Длина первого строки значения все сломает.

Ну вот -precision 5 как раз и ограничивает точность пятью знаками. Может, эту опцию недавно ввели и у тебя еще старая версия? Это надо глянуть. Или надо сейчас глянуть, есть ли опции, которые для каждого выражения позволяют число знаков после точки определить. Но я когда смотрел, то не заметил такого.

Zubok ★★★★★
()
Ответ на: комментарий от abbat81

Хотя смотря как записывать каждый цвет в переменную. По табуляции, которой там может и нет или по количеству символов.

Да можно разделитель ввести какой-нибудь типа ";". Никто же не знает, почему именно такой формат тебе нужен. Рассчитывать, что там определенное число пробелов и знаков, глупо. Считать разделителем пробел, и все.

Zubok ★★★★★
()
Ответ на: комментарий от abbat81

Собственно нужна только magenta, котору получили. Спасибо, очень помог.

ты только посравнивай на нескольких картинках, что вывод "-verbose" то же значение выдает, что и fx:... Чтобы точно убедиться, что одинаково.

Zubok ★★★★★
()
Ответ на: комментарий от Zubok

Уже посравнивал. Результат нормальный, можно работать.

abbat81 ★★
() автор топика
Ответ на: комментарий от Zubok

И все же RGB лучше. Ато получал такое:

9.23404e-05  0.78342  0.908583  0.474493
В итоге остановился на
identify -verbose -format '%[fx:mean.r]  %[fx:mean.g]  %[fx:mean.b]' result2.jpg
0.404826  0.237665  0.129533

abbat81 ★★
() автор топика
Последнее исправление: abbat81 (всего исправлений: 1)
Ответ на: комментарий от abbat81

И все же RGB лучше. Ато получал такое:

А что не так в том, что ты получал? Я заметил в cyan непослушные числа и у меня есть. Мне кажется, там баг. Единственное поле, которое не слушается precision. Все остальные слушаются. Явно баг. Но ты сказал, что тебе только magenta нужна? Ты анализируешь остальные поля? Если нет, то зачем их вообще выводить?

identify -colorspace cmyk  -format '%[fx:mean.m]\n' picture.jpeg 

Ну и как бы дальше. Судя по значению cyan 9.23404e-05 это почти 0. Но это вполне стандартная запись числа. В чем проблема с ним арифметику провести?

Zubok ★★★★★
()
Последнее исправление: Zubok (всего исправлений: 2)
Ответ на: комментарий от abbat81

identify -verbose -format '%[fx:mean.r] %[fx:mean.g] %[fx:mean.b]' result2.jpg

Здесь verbose, в общем-то, не нужен.

Zubok ★★★★★
()
Ответ на: комментарий от Zubok

Из меня может плохой математик, но 9.23ххххх - это в 9 раз больше единицы, которая больше нуля. Т.е. еще переводить в арифметику значение. RGB просто идеально выводит.

abbat81 ★★
() автор топика
Ответ на: комментарий от abbat81

9.23404e-05 это 9.23404*10^(-5). Это почти 0. Любой калькулятор командной строки это понимает. То есть это картинка, в которой составляющей magenta практически нет.

https://ru.wikipedia.org/wiki/Экспоненциальная_запись#Представление_чисел_в_п...

Zubok ★★★★★
()
Последнее исправление: Zubok (всего исправлений: 3)
Ответ на: комментарий от abbat81

Ты, кстати, можешь умножить числа и делать арифметику прямо в identify %[fx:mean.r*10000] и тогда вот это e-5 исчезнет и будет число 9.23404. Можно даже округлить - там есть вроде функции floor(), round(), ceil()

Zubok ★★★★★
()
Ответ на: комментарий от Zubok

На самом деле нужно избегать этого алгоритма CMYK.

Тут:

Оценка заполненности pdf файла

я разобрал заполненность страниц с выводом, что 100% заполненности - это maximum(CMYK), т.е. C+M+Y+K=4.0000. Но когда ручки дошли до реализации задуманного, то получил бред. Вот скриншот, в фокусе 3 страница, практически белая, но с каким тотальным заполнением - где там те цвета, так и не понял.

[img]https://i.ibb.co/TMCvtYH/2019-10-29-224502-1680x1050-scrot.png[/img]

Вот вывод 1-3 страниц. С первой все ясно, но 2- и 3 - откуда такие большие значения?

$ gs -q -dNOPAUSE -dBATCH -dFirstPage=1 -dLastPage=1  -sDEVICE=inkcov -o - 456.pdf 
 0.74921  0.79723  0.67050  0.51624 CMYK OK (=2,73=68%)
$ gs -q -dNOPAUSE -dBATCH -dFirstPage=2 -dLastPage=2  -sDEVICE=inkcov -o - 456.pdf
 0.34665  0.58061  0.68896  0.04537 CMYK OK (=1,66=41%)
$ gs -q -dNOPAUSE -dBATCH -dFirstPage=3 -dLastPage=3  -sDEVICE=inkcov -o - 456.pdf
 0.24093  0.63186  0.72578  0.01659 CMYK OK (=1,61=40%)

abbat81 ★★
() автор топика
Ответ на: комментарий от abbat81

где там те цвета, так и не понял.

А ты разложи на составляющие CMYK — увидишь. Это же скан, насколько я понимаю, и этот скан не черно-белый. И у тебя усреднение по всей странице. Если у тебя есть область где-то, где сильная составляющая, скажем, magenta, то она будет ощутимой и при подсчете среднего значения на страницу. Для случая страниц твои алгоритмы не сработают нормально. Но в случае с кнопкой область закрашена практически полностью. Тебе надо проанализировать картинку размером с твою кнопку, которая же вся равномерно или примерно равномерно закрашена сплошным цветом.

Zubok ★★★★★
()
Последнее исправление: Zubok (всего исправлений: 3)
Ответ на: комментарий от abbat81

Так как изображение ты дал сильно сжатое, то вот такой и результат. Тут я извлек только magenta и инвертировал, то есть чем чернее, тем magenta больше. Вот у тебя она выползает при вычислении среднего на страницу. https://imgur.com/a/2tzyrAG

Zubok ★★★★★
()
Последнее исправление: Zubok (всего исправлений: 1)
Ответ на: комментарий от abbat81

На самом деле нужно избегать этого алгоритма CMYK.

Вообще, среднее (mean) - это не единственный параметр, который может потребоваться принять во внимание. identify выдает еще standard deviation, kurtosis, skewness и entropy.

https://en.wikipedia.org/wiki/Color_moments

Zubok ★★★★★
()
Ответ на: комментарий от Zubok

По поводу среднего - там страница почти белая, вся, с легким фоном. Как можно каждому цвету дать по 40% - загадка, там от силы 5%.Потому и неподходящий. Средний ОК, но как средний может быть 40% если страница почти пустая. Там в ветке посоветовали перевести в серый. В итоге этот алгоритм самый подходящий. Проверил на том же файле. Что касается анализа цвета в этой ветки, где мне нужена magenta, вернее RED, то меня опять не устроил CMYK, в итоге отлично получается определить количество красного:

identify -verbose -format '%[fx:mean.r]' result1.jpg

abbat81 ★★
() автор топика
Ответ на: комментарий от abbat81

Как можно каждому цвету дать по 40% - загадка, там от силы 5%.

Мы сейчас уже не обосновываем метод, а разбираем, почему так получилось. Страница там не пустая. Там буквы, в которых насыщенность magenta, как видно, большая. Может быть, даже на полную шкалу. И фон там, если он не точно белый, то тоже имеет на всей странице какое-то фоновое значение magenta, пусть и небольшое. Поэтому в среднем может получиться. Или должны быть основания не доверять алгоритму (простому, в общем-то). Можно сделать тестовый файл с закрашенными областями чистой magenta в CMYK и прогнать, проверив, правильно ли считает.

Zubok ★★★★★
()
Последнее исправление: Zubok (всего исправлений: 1)
Ответ на: комментарий от Zubok

Вот файл, речь про третью страницу, там нет никаких 63% и 72% цвета на практически белой странице, третьей старнице.

$ gs -q -dNOPAUSE -dBATCH -dFirstPage=3 -dLastPage=3  -sDEVICE=inkcov -o - 456.pdf
 0.24093  0.63186  0.72578  0.01659 CMYK OK (=1,61=40%)

https://drive.google.com/file/d/1CTf9iFKaUSvdGPr-nVKSTD1oI28Abpz9/view?usp=sh...

abbat81 ★★
() автор топика
Последнее исправление: abbat81 (всего исправлений: 1)
Ответ на: комментарий от Zubok

Вот опытным путем залил страницу цветом, который указан в выводе, см. CMYK в GIMP https://ibb.co/gtVCkXZ

UPD.Да уж, даже в GIMP нашел баг - после каждой установки цвета по CMYK значение из C переносить в значение K. Бредятина какая-то. Установи в GIMP цвет по наших цетырех цифрах, потом закрой выбор цвета, залей страницу, потом опять выбрать цвет, вкладка CMYK и пипеткой по только-что залитой странице - значение C - 0, но его значение уже в K... решето ....

abbat81 ★★
() автор топика
Последнее исправление: abbat81 (всего исправлений: 2)
Ответ на: комментарий от abbat81

Да, на эту страницу результаты кажутся странными. На самом деле, там все страницы с текстом имеют большой ink coverage по всем цветам. Я подумал, что, может быть, как-то неправильно интерпретируем результаты (документация на сайте, кстати, упорно молчит, как их интерпретировать). Я заглянул в исходник gs, а там вот такое:

 * output is plain text; one line per page.
 * columns 1 through 4 give the fraction of pixels containing
 * c, m, y and black ink.
 * column 5 is the string 'CMYK'.
 * column 6 is 'OK' if everything went fine, 'ERROR' if there
 * was a problem.

fraction of pixels containing c, m, y and black ink! Вот что выдает это устройство! Хе-хе-хе.

Еще более интересно то, что исходник открыл одну тайну: там еще один девайс в этом же файле описан - ink_cov. И комментарий к нему: gave ink coverage values not ratecoverage.

И выдает он числа уже в процентах, если судить по коду. И считает по-другому:

    for (y = 0; y < height; y++) {
        byte *row, *end;

        code = gdev_prn_get_bits(pdev, y, line, &row);
        if (code < 0)
            break;
        end = row + raster;

        for (; row < end; row += 4) {
          
			dc_pix += row[0];
                        dm_pix += row[1];
			dy_pix += row[2];
			dk_pix += row[3];
			++total_pix;
        }
    }

...

    {
        double c = -1., m = -1., y = -1., k = -1.;
        if (code == 0) {
            c = (dc_pix*100) / (total_pix*255);
            m = (dm_pix*100) / (total_pix*255);
            y = (dy_pix*100) / (total_pix*255);
            k = (dk_pix*100) / (total_pix*255);
        }

Раз на 100 умножает, то это в процентах.

Вывод на твою третью страницу:

gs -q -dNOPAUSE -dBATCH -dFirstPage=3 -dLastPage=3 \
 -sDEVICE=ink_cov -o - 456.pdf 
 1.81716  1.58161  1.31144  0.10283 CMYK OK

А вот на первую:

gs -q -dNOPAUSE -dBATCH -dFirstPage=1 -dLastPage=1  
 -sDEVICE=ink_cov -o - 456.pdf 
53.70799 51.41258 13.93754  2.18800 CMYK OK

Zubok ★★★★★
()
Последнее исправление: Zubok (всего исправлений: 1)
Ответ на: комментарий от Zubok

Но тут уже недосчитывает. В Либре сделал страницу полностью черной, под ноль. В итоге получил:

$ gs -q -dNOPAUSE -dBATCH -dFirstPage=1 -dLastPage=1 -sDEVICE=ink_cov -o - 3.pdf
72.15686 67.84314 67.05882 88.62745 CMYK OK
Сумма - 295,68627. Я думал четыре канала - 100% - это значение 400.

https://drive.google.com/file/d/1YRmeMFR0oVh3iFMD_B1zAI8YkKITnNhF/view?usp=sh...

abbat81 ★★
() автор топика
Последнее исправление: abbat81 (всего исправлений: 1)
Ответ на: комментарий от abbat81

Это, скорее всего, результат преобразования из RGB в CMYK, описанный в стандарте PostScript. Твой файл pdf определен в цветах RGB. С черным не ожидай ничего хорошего. Он не выдаст 0.0 0.0 0.0 100.0

Zubok ★★★★★
()
Ответ на: комментарий от Zubok

Я могу делить сумму значений и на три, но не выдаст ли мне когда нибудь 125% заполненности? )) Как сэмулировать страницу без RGB для проверки?

abbat81 ★★
() автор топика
Последнее исправление: abbat81 (всего исправлений: 1)
Ответ на: комментарий от Zubok

Перелопатил для своей черной старницы все профили CMYC на сайте https://www.pdf2cmyk.com - все практически одинаковые результаы. Значить 100% - это сумарное значение до 300.

abbat81 ★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.