Я хочу изменить DPI с помощью ImageMagick, не меняя фактический размер байтов данных изображения.

Я хочу изменить DPI с помощью ImageMagick, не меняя фактический размер байтов данных изображения.

В GIMP есть очень простой способ сделать то, что я хочу. У меня установлен только немецкий диалог, но я попробую перевести его. Я говорю о переходе Picture -> PrintingSizeи настройке значений X-Resolutionи , Y-Resolutionкоторые мне известны как так называемые значения DPI. Вы также можете выбрать формат, который по умолчанию Pixel/Inch. (На немецком языке диалог Bild -> Druckgrößeи там X-Auflösungи Y-Auflösung)

Хорошо, значения там часто 72по умолчанию. Когда я меняю их, например, 300это приводит к тому, что изображение остается тем же на компьютере, но если я его распечатаю, оно будет меньше, если вы посмотрите на него, но все детали останутся, просто меньше -> у него будет более высокое разрешение на печатной бумаге (но меньший размер... что меня вполне устраивает).

Я часто так делаю, когда работаю с LaTeX, или, точнее, с командой pdflatexна последней Ubuntu-Machine. Когда я делаю вышеуказанный процесс вручную с GIMP, все работает просто отлично. Изображения будут выглядеть меньше в результирующем PDF, но с высоким качеством печати.

Я пытаюсь автоматизировать процесс перехода в GIMP и настройки значений DPI. Поскольку ImageMagick известен как превосходный инструмент, и я использовал его для многих других задач, я попытался достичь своей цели с помощью этого инструмента. Но он просто не делает то, что мне нужно.

Перепробовав множество вариантов, я пришел к выводу, что это именно та команда, которая должна стать моим другом:

convert input.png -density 300 output.png

Это должно установить DPI на 300, так как я могу читать везде в Интернете. Кажется, это работает. Когда я проверяю файл, он остается прежним (EDIT: что я и ожидал, как объяснялось выше).

file input.png output.png
     input.png: PNG image data, 611 x 453, 8-bit grayscale, non-interlaced
    output.png: PNG image data, 611 x 453, 8-bit grayscale, non-interlaced

Когда я использую эту команду, кажется, она делает то, что я хотел:

identify -verbose output.png | grep 300
    Resolution: 300x300
    PNG:pHYs                 : x_res=300, y_res=300, units=0

(Забавно, но тот же самый вывод и input.pngсбивает меня с толку... так что, возможно, это не те параметры, за которыми нужно следить?)

Нокогда я теперь рендерю свой TeX с pdflatexизображением, оно все еще большое и размытое. Также, когда я снова открываю изображение в GIMP, значения DPI устанавливаются на , 72а не на 300. Так что на самом деле никакого эффекта не было.

В чем тут проблема? Я что-то совсем не так понимаю? Я не могу ошибаться настолько, поскольку в GIMP все работает отлично.

Спасибо за любую помощь в этом. Я также открыт для других автоматизированных решений, которые легко реализовать на системе Linux.

решение1

Укажите единицы измерения. Кажется, я припоминаю, что у меня возникали проблемы, когда я пропускал эту опцию (хотя DPI должен быть значением по умолчанию), например:

convert -units PixelsPerInch input.png -density 300 output.png

Знаете ли вы, какие встроенные поля данных использует GIMP для считывания разрешения - есть ли у него свои собственные, которые переопределяют стандартные, используемые ImageMagick? Например, Photoshop использует Photoshop:XResolutionи Photoshop:YResolutionпоэтому вам нужно задать их для Photoshop, чтобы распознать настройку плотности (ImageMagick не может этого сделать - мы используем ExifTool).

решение2

Я не мог понять, как убедитьконвертироватьчтобы только добавить метаданные и не перекодировать мое [монохромное] растровое изображение; это увеличивало размер файла более чем на 50%.

Я обнаружил, чтоpngcrush(не инструмент ImageMagick) также может добавлять метаданные плотности. Эта командная строка помечает его как 600 точек на дюйм и допускает другие оптимизации, что уменьшает размер файла примерно на 10%:

pngcrush -res 600 in.png out.png

решение3

Обратите внимание, что вы можете использовать Exiftool для чтения резолюций. Например, Exiftool '-*resolution*' c.jpgможет показать

Единица разрешения: дюймы Разрешение по оси X: 300 Разрешение по оси Y: 300

Exiftool также может задавать параметры, но, как отмечено на странице руководства Image::ExifTool::TagNames, дополнительные теги XResolution и YResolution не доступны для записи Exiftool.

Я не знаю, есть ли в ImageMagick опции изменения разрешения, но был бы удивлен, если бы их не было. Кроме того, писать скрипты GIMP для автоматизации таких задач несложно, и можно менять разрешение с помощью небольших программ. Например, ниже приведена программа на языке C (компилируемая с помощью gcc setRes.c -O3 -Wall -o setRes), которая считывает первые несколько байтов файла jpeg, изменяет разрешение на 300 и перезаписывает их. Программа, как показано, использует константы для машин с прямым порядком байтов, например x86. Если запустить ее на машине с обратным порядком байтов, она должна завершиться с сообщением типа Error: xyz may be not a .jpg file, даже если xyzявляетсяфайл jpeg. Обратите внимание, что я не тестировал полученные изображения через pdflatex; вы, вероятно, сочтете целесообразным задать вопрос втекс SE.

/* jiw -- 24 Sep 2012 -- Re: set resolution in a jpg -- Offered without
warranty under GPL v3 terms as at http://www.gnu.org/licenses/gpl.html
*/
#include <stdlib.h>
#include <stdio.h>
void errorExit(char *msg, char *par, int fe) {
  fprintf (stderr, "\n%3d Error: %s %s\n", fe, msg, par);
  exit (1);
}
// Note, hex constants are byte-reversed on little vs big endian machines
enum { JF=0x464a, IF=0x4649, L300=0x2c01, B300=0x012c, NEWRES=L300};
int main(int argc, char *argv[]) {
  FILE *fi;
  short int buf[9];
  int r, L=sizeof buf;
  if (argc<2) errorExit(argv[0], "requires a .jpg file name", 0);
  fi = fopen(argv[1], "r+b");
  if(!fi) errorExit("open failed for", argv[1], ferror(fi));
  r = fread(buf, 1, L, fi);
  if (r != L) errorExit("read failed for", argv[1], ferror(fi));
  if (buf[3] != JF || buf[4] != IF) // Check JFIF signature
    errorExit(argv[1], "may be not a .jpg file", 0);
  buf[7] = buf[8] = NEWRES;
  fseek(fi, 0, SEEK_SET);
  r = fwrite(buf, 1, L, fi);
  if (r != L) errorExit("write failed for", argv[1], ferror(fi));
  return 0;
}

решение4

«Я хочу изменить DPI с помощью Imagemagick, не меняя фактический размер байтов данных изображения».

Это совершенно невозможно!

Потому что:

     more "Dots per Inch" 
<==> more pixels per area 
<==> more total pixels per image 
<==> more total bytes per image

Кроме того, вы, похоже, не понимаете, что такое DPI на самом деле:

  1. Это совершенно абстрактное значение, которое приобретает практическую ценность только в контексте знания абсолютного размера распечатки или отображения на экране или мониторе:
    • Вы можете «напечатать» то же самое изображение размером 72x72 пикселя на квадрате шириной 1 дюйм: распечатка будет иметь разрешение 72dpi.
    • Вы также можете «распечатать» его на квадрате шириной 1/4 дюйма: тогда распечатка будет иметь разрешение 288dpi.
    • (Примечание: если вы «распечатаете» его на 288dpiквадрате размером 1 дюйм, это уже будет не то же самое изображение: оно подвергнется некоторой экстраполяции через драйвер принтера или какой-либо другой механизм фильтрации, и вместо изображения размером 72x72 пикселя оно станет изображением размером 288x288 пикселей...)
  2. Обе распечатки будут содержать одинаковую информацию об изображении — изображение с разрешением 288 точек на дюйм не будет внезапно содержать больше информации.

Если вы хотите распечатать исходное изображение размером 72x72 пикселя как квадрат шириной 1 дюйм, но в 288dpi, то вам придетсяизменить масштабизображение (в данном случае масштабирование). На каждый 1 пиксель в оригинале вам понадобится 4 пикселя нового, масштабированного изображения. Теперь есть разные алгоритмы, которые можно использовать для вычисления того, какие цветовые значения должны иметь эти 4 пикселя (3 из которых новые):

  • вы можете дать им то же самое, что и исходному пикселю (что является очень «сырым» алгоритмом,
  • или вы можете выполнить усреднение значения цвета исходного пикселя со значениями цвета соседних пикселей.

В любом случае вы создаете большее изображение, состоящее из 288 рядов пикселей, каждый из которых имеет высоту 288 пикселей (288x288 пикселей).

Что делает для вас Gimp, когда вы переходите через «Изображение -> Размер печати»: он упрощает процесс пересчета требуемых изменений в абсолютных размерах пикселей, делая его более удобным для пользователя. Для этой цели...

  • ...сначала он спрашивает вас о DPI, потому что данный принтер не может произвольно менять разрешение печати (некоторые могут предлагать не одно, а может быть даже 2 или 3 разных разрешения). Поэтому он спрашивает вас, с каким разрешением вы хотите печатать. Это первая информация.
  • ...затем он также запрашивает вторую часть информации: в каком размере (в cm, mmили inch) распечатка должна быть отображена на бумаге.

На основе этих двух данных Gimp затем вычисляет общее количество пикселей, которое ему необходимо использовать (экстраполируя исходное количество пикселей), чтобы заполнить запрошенное пространство при запрошенном разрешении.

Однако масштабирование растрового изображения путем добавления в него большего количества пикселей не добавляет к нему реальной информации, а только добавляет ему «качество», которое является фиктивным. Это можетсмотретьприятнее для человеческого глаза, если ваш алгоритм масштабирования «хороший». И это будет выглядеть уродливо, если вы просто удвоите, утроите или учетверите существующие пиксели, как это делают некоторые простые алгоритмы.

Для растровых изображений,
настройка DPI имеет значение только в контекстепечатьилиотображениеэто. Потому что принтеры или мониторы имеют фиксированные разрешения. Поэтому это информация, которая только...

  • ...драйвер принтера или
  • ...приложение для обработки изображений, поддерживающее печать

надо знать.

ИДокументация ImageMagickполностью согласен со мной:

-density width
-density widthxheight
Установите горизонтальное и вертикальное разрешение изображения для рендеринг на устройства.

Для векторных изображений или форматов файлов
(например, PDF или PostScript), однако настройка DPI чрезвычайно важна в контекстерастеризацияих. Более высокий DPI перенесет больше информации об изображении в растровый формат и, следовательно, сохранит больше деталей из реального исходного качества. При конвертации векторного изображения заданного размера в mm, cmили inchв растр с более высоким DPI будет напрямую преобразовано в большее количество общих пикселей в изображении.

Также ImageMagick не поддерживает 'печать' как таковую. Вместо этого ImageMagick только...

  • ...конвертирует файлы из заданного растрового формата в другие растровые форматы;
  • ...или уменьшает или увеличивает масштаб растровых изображений;
  • ...или изменяет значения цвета в соответствии с определенным алгоритмом;
  • ...или обрезает изображения, накладывает их, инвертирует, отражает их;
  • ...и что "нет....

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

Некоторые форматы изображений (TIFF, PNG,...) поддерживают сохранение настроек DPI внутри своих метаданных.

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

«Когда я проверяю файл, он остается прежним».

Эта «подсказка» может быть автоматически оценена драйверами принтера или программами создания страниц, такими как LaTeX. При отсутствии таких «подсказок» DPI (или если они каким-то образом не представляют себя так, как ожидает LaTeX), LaTeX все равно должен иметь возможность отдавать команды на отображение любого заданного изображения на странице так, как ожидается — ему просто нужно немного более явного кода LaTeX вокруг изображения!

Некоторые другие форматы изображений (JPEG(?), BMP,...) даже не поддерживают сохранение подсказки DPI во внутренних метаданных.

Так что Gimp поддерживает только то, что вы видите, он делает с "Picture -> Printing Size", потому что он хочет напечатать изображение. С ImageMagick вы не можете печатать.

Продолжайте делать то, что хотите, с помощью Gimp при печати. ​​С ImageMagick это не имеет смысла.

Смотрите такжеэтот дополнительный фрагмент документации IM, который объясняет ту же самую тему другими словами.


Итак, остается вот что:

  • Если вы «обработаете» изображение с помощью Gimp, а затем встроите результат в LaTeX, страница будет выглядеть так, как вы ожидаете.
  • Если вы «манипулируете» своим изображением с помощью ImageMagick, а затем встраиваете результат в LaTeX, страница будет выглядетьнеткак вы и ожидаете.

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

  • точную версию вашей установки ImageMagick (полный вывод convert -versionи convert -list configure);
  • (ссылка на) исходное изображение-образец;
  • (ссылка на) то же изображение, обработанное в Gimp;
  • (ссылка на) то же изображение, обработанное с помощью ImageMagick.

Таким образом мы можем помочь решить проблему.

Но обратите внимание: это проблема, отличная от той, о которой говорится в вашей текущей теме/заголовке:«Я хочу изменить DPI с помощью Imagemagick, не меняя фактический размер байтов данных изображения»


Обновлять

Так как этовсе ещеНекоторым читателям не совсем понятно то, что я отметил выше, вот еще одна попытка...

Что бы ни было отмечено как'Разрешение'или'Плотность'внутри файла изображения находитсяатрибут метаданных. Он не влияет на количество реальных пикселей, описанных файлом, и совершенно не имеет значения в этом отношении. Это простонамекатькоторые печатающее или визуализирующее устройство или приложение могутили нетсоблюдайте при печати, визуализации или отображении изображения.

Для этой цели это всего лишь несколько чисел, хранящихся в файле изображения. Эти числа сообщают устройствам вывода, таким как принтеры, и отображают, сколько точек (или пикселей) на дюйм должно быть отображено изображение. Для векторных форматов, таких как PostScript, PDF, MWF и SVG, они сообщают пиксельной шкале, что нужно рисовать любые реальные координаты, используемые изображением.

Один пример, где значение разрешения, отмеченное ImageMagick в метаданных изображения, равноНЕТпочитаемое приложением Adobe Photoshop. Photoshop хранит свои подсказки о желаемом разрешении печати или отображения в собственном профиле с именем8бим. ImageMagick не трогает этот профиль, даже когда его просят записать изменение разрешения в метаданные файла изображения. Photoshop, с другой стороны, проигнорирует все подсказки по разрешению, сохраненные ImageMagick в стандартном поле метаданных, которое определено для этой цели, как только увидит свой собственный8бимпрофиль.

ОП следовало бы выбрать заголовок:

  • «Я хочу изменить DPI (метод разрешения метаданных) с помощью ImageMagick, не меняя фактическое количество пикселей в изображении»

во избежание всяких недоразумений...

Связанный контент