Я хочу изменить 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 , Когда я делаю вышеуказанный процесс с 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.

39 голосов | спросил Boris Däppen 24 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowMon, 24 Sep 2012 19:35:33 +0400 2012, 19:35:33

4 ответа


69

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

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

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

ответил Martin Wilson 24 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowMon, 24 Sep 2012 23:03:39 +0400 2012, 23:03:39
5

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

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

Exiftool также может устанавливать параметры, но как указано в man-странице 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 a jpeg-файл. Обратите внимание: я не тестировал полученные снимки с помощью pdflatex; вы, вероятно, сочтете целесообразным разместить вопрос в tex 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;
}
ответил James Waldby - jwpat7 24 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowMon, 24 Sep 2012 21:46:48 +0400 2012, 21:46:48
2

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

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

pngcrush -res 600 in.png out.png
ответил Charles Boling 23 MarpmMon, 23 Mar 2015 21:49:53 +03002015-03-23T21:49:53+03:0009 2015, 21:49:53
-1

"Я хочу изменить 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 дюйм, это уже не то же изображение : он подвергнется некоторой экстраполяции через драйвер принтера или какой-либо другой механизм фильтрации, и он станет образцом 288x288 пикселей вместо изображения с разрешением 72x72 пикселя ... )
  2. Обе распечатки будут иметь одинаковую информацию об изображении - изображение 288 точек на дюйм не будет иметь больше.

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

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

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

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

  • ... сначала спрашивает вас о DPI, потому что данный принтер не может изменить свое разрешение печати произвольно (некоторые могут предлагать не одно, а, может быть, и два или три разных разрешения). Поэтому он запрашивает у вас разрешение, которое вы хотите распечатать. Это первая информация.
  • ... затем он также запрашивает вторую часть информации: при которой размер (в 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 должен все же быть в состоянии заставить отображать любое изображение на странице так, как этого ожидают to - ему нужен только какой-то более явный код 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 без изменения фактического размера данных изображения»


Update

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

Все, что отмечено как 'Resolution' или 'Density' внутри файла изображения, является атрибутом метаданных . Он не влияет на количество фактических пикселей, описанных в файле, и в этом отношении совершенно не имеет значения. Это всего лишь hint , который печатает или делаетустройство или приложение могут или не могут следовать при печати, рендеринге или отображении изображения.

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

В одном примере, когда значение разрешения, указанное ImageMagick внутри метаданных изображения, NOT , выполняемое приложением, - это Adobe Photoshop. Photoshop сохраняет подсказки о желаемой печати или разрешении экрана в проприетарном профиле с именем 8bim . ImageMagick не затрагивает этот профиль, даже когда его просят записать изменение разрешения в метаданные файла изображения. Photoshop, с другой стороны, будет игнорировать все подсказки разрешения, сохраненные ImageMagick, в стандартном стандартном поле метаданных, которое определено для этой цели, как только он увидит свой собственный профиль 8bim .

OP должен был выбрать заголовок:

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

, чтобы избежать всех недоразумений ...

ответил Kurt Pfeifle 25 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowTue, 25 Sep 2012 01:17:16 +0400 2012, 01:17:16

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132