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


45

김프에는 내가 원하는 것을 할 수있는 매우 간단한 방법이 있습니다. 독일어 대화 상자 만 설치했지만 번역하려고합니다. 나는 Picture -> PrintingSizeValues 에 가고 조정하는 것에 대해 이야기 X-Resolution하고 Y-Resolution있으며 DPI 값이라고도합니다. 기본적으로 형식을 선택할 수도 있습니다 Pixel/Inch. (독일어 대화는 Bild -> Druckgröße거기 X-AuflösungY-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나에게 혼란을 초래합니다 ... 그래서 이것이 잘못된 매개 변수 일 수 있습니까?

그러나 이제 pdflatex이미지로 TeX를 렌더링 할 때 여전히 크고 흐릿합니다. 또한 김프로 이미지를 다시 열면 DPI 값이 72대신 설정됩니다 300. 실제로 아무런 효과가 없었습니다.

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

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


user1694803 : 마틴 윌슨의 답변으로 돌아가서 ^자신의 답변 왼쪽 에있는 작은 아이콘을 클릭하여 자신의 평판을 얻 자마자 '수락'하는 것이 아니라 ' 투표'해야한다는 점을 기억 해야합니다. +15) ...
커트 파이 플

답변:


76

단위를 지정하십시오-DPI를 기본값으로 설정해야하지만이 옵션을 생략했을 때 문제가 발생했습니다.

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

김프가 해상도를 읽기 위해 사용하는 내장 데이터 필드를 알고 있습니까? ImageMagick에서 사용하는 표준 데이터 필드를 대체하는 자체 필드가 ​​있습니까? 예를 들어, 포토샵 사용 Photoshop:XResolution하고 Photoshop:YResolution포토샵은 농도 설정을 인식하기 때문에 당신이이 (- 우리가 ExifTool를 사용 ImageMagick이이 작업을 수행 할 수 없음) 다음을 설정합니다.


2
나는 -density 300전에 넣어야 했다 input.png. PDF를 변환하고있었습니다. 어쨌든 고마워
akostadinov 2016 년

PNG에서 TIFF로 변환하려면을 (를) 사용해야했습니다 . 옵션 순서에 관계없이 -set units PixelsPerInch -density 300simple -units이 작동하지 않았습니다.
Andrey

5

Exiftool을 사용하여 해상도를 읽을 수 있습니다. 예를 들어, Exiftool '-*resolution*' c.jpg표시 할 수 있습니다

해상도 단위 : 인치 X 해상도 : 300 Y 해상도 : 300

Exiftool은 매개 변수를 설정할 수도 있지만 Man 페이지에 언급 된 것처럼 Image::ExifTool::TagNamesExiftool에서 Extra Tags XResolution 및 YResolution을 쓸 수는 없습니다.

ImageMagick에 해상도 변경 옵션이 있는지 모르겠지만 그렇지 않은 경우 놀랍습니다. 또한 이와 같은 작업을 자동화하기 위해 김프 스크립트를 작성하는 것이 간단하며 작은 프로그램으로 해상도를 변경할 수도 있습니다. 예를 들어, 다음은 gcc setRes.c -O3 -Wall -o setResjpeg 파일의 처음 몇 바이트를 읽고 해상도를 300으로 변경 한 후 다시 쓰는 C 프로그램 (을 통해 컴파일 가능 )입니다. 표시된 프로그램은 x86과 같은 리틀 엔디안 머신에 상수를 사용합니다. xendian 머신에서 실행되는 Error: xyz may be not a .jpg file경우 xyz 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;
}

1
PNG를 다루고 있으며 JPG 또는 C에 대한 단서가 많지 않기 때문에 도움이되지 않습니다. 다른 사람이 사용할 수 있습니다.
Boris Däppen

그렇습니다. 나는 그 질문에 더주의를 기울여야했습니다! 다시 읽으면 JPG는 언급되지 않고 PNG는 명확하게 나타납니다.
James Waldby-jwpat7

예, 저는 다른 사람이며 사용할 있습니다. 16 진수 편집기에서 .jpg 파일을 열고 세로 및 가로 밀도를 위해 9 번째와 11 번째 바이트를 편집했습니다. 말하자면, 코드를 수동으로 "실행"했습니다.
u_Ltd.

2

메타 데이터 만 추가하고 [흑백] 비트 맵을 다시 인코딩하지 않도록 변환 하도록 설득하는 방법을 알 수 없었습니다 . 파일을 50 % 이상 확장하고있었습니다.

ImageMagick 도구가 아닌 pngcrush 도 밀도 메타 데이터를 추가 할 수 있음을 발견했습니다 . 이 명령 줄은 600dpi로 표시하고 다른 최적화를 허용하여 파일 크기를 ~ 10 % 줄였습니다.

pngcrush -res 600 in.png out.png

-1

"이미지 데이터의 실제 바이트 크기를 변경하지 않고 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.
    • ( 참고 : 288dpi1 인치 정사각형으로 '인쇄'하면 더 이상 같은 이미지가 아닙니다. 프린터 드라이버 나 다른 필터링 메커니즘을 통해 일부 추정이 수행되어 이미지가 아닌 288x288 픽셀 이미지가됩니다. 72x72 픽셀 이미지 ... )
  2. 두 출력물 모두 이미지 정보가 동일합니다. 288dpi 이미지에는 갑자기 더 많은 정보가 없습니다.

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

  • 원래 픽셀과 동일하게 만들 수 있습니다 (매우 "원시"알고리즘 인
  • 또는 인접한 픽셀의 색상 값으로 원본 픽셀의 색상 값을 평균화 할 수 있습니다.

어쨌든 각각 288 픽셀 (288x288 픽셀) 인 288 행의 픽셀로 구성된 더 큰 이미지를 만듭니다.

"그림-> 인쇄 크기"를 진행할 때 Gimp가 수행하는 작업 : 절대 픽셀 크기에서 필요한 변경 사항을 다시 계산하는 과정을 단순화하여보다 사용자 친화적입니다. 이 목적을 위해...

  • ... 먼저 주어진 프린터가 인쇄 해상도를 임의로 변경할 수 없기 때문에 DPI에 대해 먼저 묻습니다 (일부는 1 개가 아니라 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는 이미지를 인쇄하려고하기 때문에 "그림-> 인쇄 크기"에서 수행하는 작업 만 지원합니다. ImageMagick을 사용하면 인쇄 할 수 없습니다.

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

동일한 추가 주제를 다른 단어로 설명하는 이 추가 IM 설명서 스 니펫 도 참조하십시오 .


남아있는 것은 이것입니다.

  • Gimp로 이미지를 '조작'한 다음 결과를 LaTeX에 포함 시키면 페이지가 예상 한 것처럼 보입니다.
  • 당신은 ImageMagick를 사용하여 이미지를 '조작'다음 라텍스 결과를 포함하면 페이지의 모습은 없습니다 당신이 기대처럼.

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

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

이런 식으로 문제를 해결하는 데 도움을 줄 수 있습니다.

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


최신 정보

위에서 언급 한 내용 이 여전히 일부 독자에게는 분명하지 않기 때문에 여기에 한 번 더 시도하십시오 ...

어쨌든 같이 주목 '결의' 또는 '고밀도' 이미지 파일 내부에, A는 메타 데이터 속성 . 파일에서 설명하는 실제 픽셀 수에는 영향을 미치지 않으며이 점에서 완전히 관련이 없습니다. 이미지를 인쇄, 렌더링 또는 표시 할 때 인쇄 또는 렌더링 장치 또는 응용 프로그램이 따를 수도 있고 따르지 않을 수도 있는 힌트 일뿐 입니다.

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

이미지 메타 데이터 내에서 ImageMagick이 지적한 해상도 값 이 응용 프로그램에서 인정 되지 않는 한 가지 예 는 Adobe Photoshop입니다. Photoshop은 원하는 인쇄 또는 디스플레이 해상도에 대한 힌트를 8bim 이라는 독점 프로파일에 저장 합니다. ImageMagick은 이미지 파일의 메타 데이터에 해상도 변경을 쓰라는 요청이 있어도이 프로파일을 건드리지 않습니다. 반면 Photoshop은 ImageMagick이 자체 8bim 프로파일을 보자 마자이 목적으로 정의 된 표준 메타 데이터 필드에 ImageMagick이 저장 한 모든 해상도 힌트를 무시 합니다.

OP는 제목을 선택해야합니다.

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

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


1
"파일을 확인하면 동일하게 유지됩니다." 이것이 내가 원하는거야. 나는이 말이 나를 놀라게하는 내용으로 말하지 않는다. PLEAS 내 질문을 다시 읽으십시오 ... 천천히 ... ARGL
Boris Däppen

6
"이것은 완전히 불가능하다!" 불가능합니다. 인쇄 할 때 이미지가 축소되는 것입니다. 내 질문에 매우 자세히 설명되어 있습니다
Boris Däppen

5
당신은 무엇에 대해 이야기하고 있습니까? 질문에 유스 케이스를 자세히 설명했습니다. 제목만으로 질문에 대답하면 여기있는 사람에게 도움이되지 않습니다.
Boris Däppen

4
치명적인 결함은 "가상 당 더 많은 픽셀 수 <==> 더 많은 이미지 당 총 픽셀 수"라는 초기 가정이었습니다. 이는 면적이 일정한 경우에만 해당됩니다. 그렇지 않다.
레오 이젠

1
예. DPI는 장치로 렌더링되는 경우에만 의미가 있습니다. 또한이 해상도와 관련이있을 때 이미지 파일에 저장할 수있는 필드입니다. 이 질문은 픽셀 데이터를 변경하지 않고이 필드를 변경하는 방법을 명확하게 물었습니다.
레오 이젠
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.