이미지 데이터의 실제 바이트 크기를 변경하지 않고 ImageMagick으로 DPI를 변경하고 싶습니다.

이미지 데이터의 실제 바이트 크기를 변경하지 않고 ImageMagick으로 DPI를 변경하고 싶습니다.

김프에는 내가 원하는 것을 할 수 있는 아주 간단한 방법이 있습니다. 독일어 대화상자만 설치되어 있지만 번역해 보겠습니다. 나는 소위 DPI 값이라고 알려진 Picture -> PrintingSizeX-Resolution으로 가서 조정하는 것에 대해 이야기하고 있습니다. Y-Resolution기본적으로 형식을 선택할 수도 있습니다 Pixel/Inch. (독일어에서는 대화 상자가 Bild -> Druckgrößeand there X-Auflösungand 입니다 Y-Auflösung.)

72좋습니다. 기본적으로 값이 있는 경우가 많습니다 . 예를 들어 이를 변경하면 300이미지가 컴퓨터에서 동일하게 유지되는 효과가 있지만 인쇄하면 보면 더 작아지지만 모든 세부 사항은 그대로 유지됩니다. 단지 더 작습니다. 인쇄된 용지의 해상도는 더 높습니다(하지만 크기는 더 작습니다... 나에게는 괜찮습니다).

나는 LaTeX로 작업할 때나 pdflatex최신 Ubuntu-Machine의 명령을 정확히 수행할 때 종종 그렇게 합니다. 김프를 사용하여 위 프로세스를 수동으로 수행하면 모든 것이 잘 작동합니다. 결과 PDF에서는 이미지가 더 작게 표시되지만 인쇄 품질은 높습니다.

제가 하려는 것은 김프에 들어가서 DPI 값을 조정하는 과정을 자동화하는 것입니다. ImageMagick은 훌륭하다고 알려져 있고 다른 많은 작업에도 사용했기 때문에 이 도구를 사용하여 목표를 달성하려고 노력했습니다. 하지만 내가 원하는 대로 되지 않을 뿐입니다.

많은 것을 시도한 후에는 이것이 실제로 내 친구가 되어야 할 명령이라고 생각합니다.

convert input.png -density 300 output.png

웹 어디에서나 읽을 수 있으므로 DPI를 300으로 설정해야 합니다. 작동하는 것 같습니다. 파일을 확인하면 동일하게 유지됩니다(편집: 위에서 설명한 대로 예상한 대로입니다).

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이미지로 렌더링해도 여전히 크고 흐릿합니다. 72또한 김프로 이미지를 다시 열면 DPI 값이 300. 그래서 실제로는 전혀 효과가 없었습니다.

이제 여기서 문제가 무엇입니까? 내가 뭔가 완전히 잘못 알고 있는 걸까? 김프에서는 모든 것이 잘 작동하기 때문에 나는 그렇게 틀릴 수 없습니다.

도움을 주셔서 감사합니다. 나는 또한 Linux 시스템에서 쉽게 수행할 수 있는 다른 자동화 솔루션에도 열려 있습니다.

답변1

단위를 지정하세요. 이 옵션을 생략했을 때 문제가 있었던 것으로 기억합니다(DPI가 기본값이어야 하지만). 예:

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

GIMP가 해상도를 읽는 데 사용하는 내장 데이터 필드를 알고 있습니까? ImageMagick에서 사용하는 표준 필드를 무시하는 자체 데이터 필드가 있습니까? 예를 들어 Photoshop Photoshop:XResolution에서는 Photoshop:YResolution밀도 설정을 인식하도록 Photoshop에서 이를 설정해야 합니다(ImageMagick에서는 이 작업을 수행할 수 없습니다. 우리는 ExifTool을 사용합니다).

답변2

어떻게 설득해야 할지 알 수가 없었어요전환하다메타데이터만 추가하고 [단색] 비트맵을 다시 인코딩하지 않습니다. 파일이 50% 이상 확장되었습니다.

나는 그것을 발견했다png크러시(ImageMagick 도구 아님)도 밀도 메타데이터를 추가할 수 있습니다. 이 명령줄은 600dpi로 표시하고 다른 최적화를 허용하여 파일 크기를 ~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에 해상도 변경 옵션이 있는지는 모르겠지만, 그렇지 않다면 놀랄 것입니다. 또한 이와 같은 작업을 자동화하기 위해 김프 스크립트를 작성하는 것이 간단하며 작은 프로그램으로 해상도를 변경하는 것도 가능합니다. 예를 들어, 다음은 gcc setRes.c -O3 -Wall -o setResjpeg 파일의 처음 몇 바이트를 읽고 해상도를 300으로 변경한 후 다시 쓰는 C 프로그램( 를 통해 컴파일 가능)입니다. 표시된 프로그램은 x86과 같은 리틀 엔디안 시스템에 대한 상수를 사용합니다. 빅엔디안 시스템에서 실행하는 경우 Error: xyz may be not a .jpg filexyz인 경우에도 다음과 같은 메시지로 종료되어야 합니다.~이다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

"이미지 데이터의 실제 바이트 크기를 변경하지 않고 Imagemagick으로 DPI를 변경하고 싶습니다."

이것은 완전히 불가능합니다!

왜냐하면:

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

또한 실제로 DPI가 무엇인지 이해하지 못하는 것 같습니다.

  1. 이는 인쇄물의 절대 크기나 화면이나 모니터에서의 렌더링을 아는 맥락에서만 실용적인 가치를 얻는 완전히 추상적인 값입니다.
    • 1인치 너비의 정사각형에 동일한 72x72픽셀 이미지를 '인쇄'할 수 있습니다. 인쇄물의 해상도는 72dpi.
    • 1/4인치 너비의 정사각형에도 '인쇄'할 수 있습니다. 그러면 인쇄물의 해상도는 288dpi.
    • (참고: 1인치 정사각형에 '인쇄'하면 288dpi더 이상 동일한 이미지가 아닙니다. 프린터 드라이버나 기타 필터링 메커니즘을 통해 일부 추정을 거쳐 288x288픽셀 이미지가 됩니다. 72x72픽셀 이미지...)
  2. 두 인쇄물 모두 매우 동일한 이미지 정보를 갖게 됩니다. 288dpi 이미지에는 갑자기 더 많은 정보가 포함되지 않습니다.

원본 72x72픽셀 이미지를 1인치 너비의 정사각형으로 인쇄하려면 다음을 288dpi수행해야 합니다.크기 조정이미지(이 경우 확대). 원본의 1픽셀마다 확대된 새 이미지의 4픽셀이 필요합니다. 이제 이 4개 픽셀(3개는 새 픽셀)이 어떤 색상 값을 가져야 하는지 계산하는 데 사용할 수 있는 다양한 알고리즘이 있습니다.

  • 원본 픽셀과 동일한 결과를 제공할 수 있습니다(이는 매우 "원시" 알고리즘이며,
  • 또는 원본 픽셀의 색상 값을 이웃 픽셀의 색상 값으로 평균화할 수도 있습니다.

어떤 경우든 각각 높이가 288픽셀(288x288픽셀)인 288행의 픽셀로 구성된 더 큰 이미지를 생성하게 됩니다.

"그림 -> 인쇄 크기"를 통해 Gimp가 수행하는 작업: 절대 픽셀 크기에서 필요한 변경 사항을 다시 계산하는 프로세스를 단순화하여 더욱 사용자 친화적으로 만듭니다. 이 목적을 위해...

  • ...특정 프린터는 인쇄 해상도를 임의로 변경할 수 없기 때문에 먼저 DPI에 대해 묻습니다(일부는 하나가 아니라 2~3가지 다른 해상도를 제공할 수도 있음). 그래서 인쇄할 해상도를 묻습니다. 첫 번째 정보입니다.
  • ...그런 다음 두 번째 정보도 묻습니다. 즉, 인쇄물이 종이에 표시되어야 하는 크기( 또는 ) cm입니다 mm.inch

이 두 가지 정보에 따르면 Gimp는 요청된 해상도에서 요청된 공간을 채우기 위해 사용해야 하는 총 픽셀 수를 계산합니다(원래 픽셀 수에서 추정).

그러나 더 많은 픽셀을 포함하도록 래스터 이미지를 확대하면 실제 정보가 추가되지 않으며 가상의 '품질'만 추가됩니다. 그럴 수도 있다바라보다확장 알고리즘이 '좋은' 알고리즘이라면 사람의 눈에는 더 좋습니다. 그리고 일부 간단한 알고리즘처럼 기존 픽셀을 두 배, 세 배, 네 배로 늘리면 보기 흉해 보일 것입니다.

래스터 이미지의 경우
DPI 설정은 다음과 같은 맥락에서만 관련됩니다.인쇄또는표시그것. 프린터나 모니터가 해상도를 고정해 주었기 때문입니다. 그러므로 그것은 단지 ...

  • ...프린터 드라이버 또는
  • ...인쇄를 지원하는 이미지 처리 애플리케이션

알 필요가있다.

그리고ImageMagick의 문서나와 완전히 동의합니다.

-density width
-density widthxheight
이미지의 수평 및 수직 해상도를 설정합니다. 장치에 렌더링합니다.

벡터 이미지 또는 파일 형식의 경우
(예: PDF 또는 PostScript) DPI 설정은 다음과 같은 상황에서 매우 중요합니다.래스터화그들을. DPI가 높을수록 더 많은 사진 정보가 래스터 형식으로 전송되므로 실제 원본 품질에서 더 많은 세부 정보가 보존됩니다. 에서 특정 크기의 벡터 이미지를 변환하거나 mmDPI 가 더 높은 래스터로 변환 cm하면 inch이미지의 총 픽셀 수가 더 많아집니다.

또한 ImageMagick은 '인쇄'를 지원하지 않습니다. 대신 ImageMagick만...

  • ...특정 래스터 형식의 파일을 다른 래스터 형식으로 변환합니다.
  • ...또는 래스터 이미지를 축소하거나 확대합니다.
  • ...또는 특정 알고리즘에 따라 색상 값을 변경합니다.
  • ...또는 이미지를 자르고, 오버레이하고, 반전하고, 미러링합니다.
  • ...그리고 뭐-말야....

...하지만 조작된 이미지를 인쇄하려면 다른 프로그램을 사용해야 합니다.

일부 이미지 형식(TIFF, PNG 등)은 메타데이터에 내부적으로 DPI 설정을 저장하는 것을 지원합니다.

그러나 이는 기본 래스터 이미지를 변경하지 않는 '힌트' 속성에 지나지 않습니다. 이것이 바로 당신이 이런 발견을 한 이유입니다:

"파일을 확인해 보니 동일하게 유지되었습니다."

이 '힌트'는 프린터 드라이버나 LaTeX와 같은 페이지 생성 프로그램에 의해 자동으로 평가될 수 있습니다. 이러한 DPI '힌트'가 없는 경우(또는 LaTeX가 예상하는 방식으로 표시되지 않는 경우) LaTeX는 페이지의 특정 이미지를 예상한 대로 렌더링하도록 명령할 수 있어야 합니다. - 이미지 주위에 좀 더 명확한 LaTeX 코드가 필요합니다!

일부 다른 이미지 형식(JPEG(?), BMP 등)은 내부 메타데이터에 DPI 힌트 저장을 지원하지 않습니다.

따라서 Gimp는 이미지를 인쇄하려고 하기 때문에 "그림 -> 인쇄 크기"를 사용하여 수행되는 작업만 지원합니다. ImageMagick을 사용하면 인쇄할 수 없습니다.

인쇄할 때 Gimp로 하고 싶은 일을 계속하세요. ImageMagick에서는 의미가 없습니다.

또한보십시오이 추가 IM 문서 조각, 동일한 주제를 다른 단어로 설명합니다.


그래서 남는 것은 이렇습니다.

  • Gimp를 사용하여 이미지를 '조작'한 다음 결과를 LaTeX에 삽입하면 페이지가 예상한 대로 보입니다.
  • ImageMagick으로 이미지를 '조작'한 다음 결과를 LaTeX에 삽입하면 페이지가 다음과 같이 보입니다.~ 아니다당신이 기대하는 것처럼.

위의 문제를 해결하려면 다음을 제공하십시오.

  • ImageMagick 설치의 정확한 버전( convert -version및 의 전체 출력 convert -list configure)
  • (링크) 원본 샘플 이미지
  • (링크) Gimp가 조작한 동일한 이미지;
  • (링크) ImageMagick이 조작한 동일한 이미지.

이렇게 하면 문제 해결에 도움이 될 수 있습니다.

그러나 참고: 이는 현재 제목/제목이 묻는 것과는 다른 문제입니다."이미지 데이터의 실제 바이트 크기를 변경하지 않고 Imagemagick으로 DPI를 변경하고 싶습니다."


업데이트

그렇기 때문에아직위에서 언급한 내용이 일부 독자에게는 명확하지 않습니다. 여기에 한 가지 더 시도가 있습니다.

다음과 같이 표기된 것은 무엇이든'해결'또는'밀도'이미지 파일 내부에는메타데이터 속성. 이는 파일에 설명된 실제 픽셀 수에 영향을 미치지 않으며 이 점과 전혀 관련이 없습니다. 그것은 단지힌트인쇄 또는 렌더링 장치 또는 응용 프로그램이아니면 그렇지 않을 수도 있다이미지를 인쇄, 렌더링 또는 표시할 때 다음을 따르십시오.

이를 위해 이미지 파일에 저장된 몇 개의 숫자만 있으면 됩니다. 이 숫자는 프린터와 같은 출력 장치에 대해 알려주며 이미지가 표시되어야 하는 인치당 도트(또는 픽셀) 수를 표시합니다. PostScript, PDF, MWF 및 SVG와 같은 벡터 형식의 경우 이미지에서 사용되는 실제 좌표를 그리도록 픽셀 크기를 지시합니다.

이미지 메타데이터 내에서 ImageMagick이 기록한 해상도 값이 다음과 같은 한 가지 예입니다.아니다응용 프로그램의 영예는 Adobe Photoshop입니다. Photoshop은 원하는 인쇄 또는 디스플레이 해상도에 대한 힌트를 다음과 같은 독점 프로필에 저장합니다.8bim. ImageMagick은 이미지 파일의 메타데이터에 해상도 변경 사항을 기록하라는 요청을 받은 경우에도 이 프로필을 건드리지 않습니다. 반면에 Photoshop은 ImageMagick이 해당 목적을 위해 정의된 표준 메타데이터 필드에 저장된 모든 해상도 힌트를 확인하는 즉시 무시합니다.8bim프로필.

OP는 다음 제목을 선택했어야 합니다.

  • '이미지의 실제 픽셀 수를 변경하지 않고 ImageMagick으로 DPI(메타데이터 해상도 힌트)를 변경하고 싶습니다.'

모든 오해를 피하기 위해...

관련 정보