Quero alterar o DPI com o ImageMagick sem alterar o tamanho real dos bytes dos dados da imagem

Quero alterar o DPI com o ImageMagick sem alterar o tamanho real dos bytes dos dados da imagem

No GIMP existe uma maneira muito simples de fazer o que eu quero. Só tenho o diálogo em alemão instalado, mas vou tentar traduzi-lo. Estou falando sobre ir Picture -> PrintingSizee ajustar os valores X-Resolutione Y-Resolutionque são conhecidos por mim como os chamados valores de DPI. Você também pode escolher o formato que por padrão é Pixel/Inch. (Em alemão o diálogo é Bild -> Druckgrößee lá X-Auflösunge Y-Auflösung)

Ok, os valores geralmente são 72padrão. Quando eu os altero, por exemplo, 300isso faz com que a imagem permaneça a mesma no computador, mas se eu imprimir, ela ficará menor se você olhar para ela, mas todos os detalhes ainda estão lá, apenas menores -> tem uma resolução mais alta no papel impresso (mas em tamanho menor... o que é bom para mim).

Costumo fazer isso quando trabalho com LaTeX ou, para ser exato, com o comando pdflatexem uma máquina Ubuntu recente. Quando estou fazendo o processo acima com o GIMP manualmente, tudo funciona bem. As imagens aparecerão menores no PDF resultante, mas com alta qualidade de impressão.

O que estou tentando fazer é automatizar o processo de entrada no GIMP e ajuste dos valores de DPI. Como o ImageMagick é conhecido por ser excelente e eu o usei para muitas outras tarefas, tentei atingir meu objetivo com esta ferramenta. Mas simplesmente não faz o que eu quero.

Depois de tentar muitas coisas, acho que este é realmente o comando que deveria ser meu amigo:

convert input.png -density 300 output.png

Isso deve definir o DPI para 300, pois posso ler em qualquer lugar da web. Parece funcionar. Quando verifico o arquivo ele permanece o mesmo (EDIT: é o que espero, conforme explicado acima).

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

Quando uso este comando, parece que ele fez o que eu queria:

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

(Engraçado, surge a mesma saída input.pngque me confunde... então esses podem ser os parâmetros errados para observar?)

Masquando agora renderizo meu TeX com pdflatexa imagem ainda grande e borrada. Além disso, quando abro a imagem com o GIMP novamente, os valores de DPI são definidos 72como em vez de 300. Então, na verdade, não houve efeito algum.

Agora, qual é o problema aqui. Estou entendendo algo completamente errado? Não posso estar tão errado, pois tudo funciona bem com o GIMP.

Obrigado por qualquer ajuda nisso. Também estou aberto a outras soluções automatizadas que são facilmente executadas em um sistema Linux.

Responder1

Especifique as unidades - lembro-me de ter tido um problema quando omiti esta opção (embora DPI deva ser o padrão), por exemplo:

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

Você sabe quais campos de dados incorporados o GIMP usa para ler a resolução - ele possui algum campo próprio que substitua os campos padrão usados ​​pelo ImageMagick? Por exemplo, o Photoshop usa Photoshop:XResolutione Photoshop:YResolutionentão você precisa configurá-los para que o Photoshop reconheça uma configuração de densidade (o ImageMagick não pode fazer isso - usamos o ExifTool).

Responder2

Eu não consegui descobrir como convencerconverteradicionar apenas os metadados e não recodificar meu bitmap [monocromático]; estava expandindo o arquivo> 50%.

Eu descobri issopngcrush(não uma ferramenta ImageMagick) também pode adicionar os metadados de densidade. Esta linha de comando marca 600 dpi e permite outras otimizações, que reduziram o tamanho do arquivo em aproximadamente 10%:

pngcrush -res 600 in.png out.png

Responder3

Observe que você pode usar o Exiftool para ler as resoluções. Por exemplo, Exiftool '-*resolution*' c.jpgpode mostrar

Unidade de resolução: polegadas X Resolução: 300 Y Resolução: 300

Exiftool também é capaz de definir parâmetros, mas conforme observado na página de manual Image::ExifTool::TagNames, as tags extras XResolution e YResolution não podem ser gravadas pelo Exiftool.

Não sei se o ImageMagick tem opções de alteração de resolução, mas ficaria surpreso se não tivesse. Além disso, é fácil escrever scripts GIMP para automatizar tarefas como essa, e também é possível alterar resoluções com programas pequenos. Por exemplo, a seguir está um programa C (compilável via gcc setRes.c -O3 -Wall -o setRes) que lê os primeiros bytes de um arquivo jpeg, altera as resoluções para 300 e as reescreve. O programa mostrado usa constantes para máquinas little-endian, como x86. Se for executado em uma máquina big-endian, ele deverá terminar com uma mensagem como Error: xyz may be not a .jpg file, mesmo que xyzéum arquivo jpeg. Observe que não testei as imagens resultantes via pdflatex; você provavelmente acharia útil postar uma pergunta notexto 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;
}

Responder4

"Quero alterar o DPI com o Imagemagick sem alterar o tamanho real dos bytes dos dados da imagem."

Isso é completamente impossível!

Porque:

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

Além disso, você parece não entender o que é DPI na realidade:

  1. É um valor completamente abstrato que só ganha valor prático no contexto de saber também o tamanho absoluto da impressão ou renderização na tela ou monitor:
    • Você pode 'imprimir' a mesma imagem de 72x72 pixels em um quadrado de 1 polegada de largura: a impressão terá uma resolução de 72dpi.
    • Você também pode 'imprimi-lo' em um quadrado de 1/4 de polegada de largura: então a impressão terá uma resolução de 288dpi.
    • (Nota: Se você 'imprimir' em 288dpium quadrado de 1 polegada, não será mais a mesma imagem: terá sofrido alguma extrapolação através do driver da impressora ou algum outro mecanismo de filtragem, e se tornará uma imagem de 288x288 pixels em vez de um Imagem de 72x72 pixels...)
  2. Ambas as impressões terão exatamente as mesmas informações de imagem – a imagem de 288 dpi não terá mais repentinamente.

Se você quiser imprimir a imagem original de 72x72 pixels como um quadrado de 1 polegada de largura, mas em 288dpi, então você terá quere-escalaa imagem (neste caso, ampliando-a). Para cada 1 pixel no original você precisará de 4 pixels da nova imagem ampliada. Agora existem diferentes algoritmos que podem ser usados ​​para calcular quais valores de cor esses 4 pixels (3 deles novos pixels) devem ter:

  • você poderia dar a eles o mesmo que o pixel original (que é um algoritmo muito "bruto",
  • ou você pode fazer uma média do valor da cor do pixel original com os valores das cores dos pixels vizinhos.

Em qualquer caso, você está criando uma imagem maior composta por 288 linhas de pixels com 288 pixels de altura cada (288x288 pixels).

O que o Gimp faz por você quando você passa por "Imagem -> Tamanho de impressão": simplifica o processo de recálculo das alterações necessárias nos tamanhos absolutos de pixels, tornando-o mais fácil de usar. Para este propósito...

  • ... primeiro pergunta sobre o DPI porque uma determinada impressora não pode alterar sua resolução de impressão arbitrariamente (algumas podem oferecer não apenas uma, mas talvez até 2 ou 3 resoluções diferentes). Então ele pergunta em qual resolução você deseja imprimir. Essa é a primeira informação.
  • ... então também pede a segunda informação: em que tamanho (em cm, mmou inch) a impressão deve aparecer no papel.

De acordo com essas duas informações, o Gimp calcula o número total de pixels que deve usar (extrapolar do número original de pixels) para preencher o espaço solicitado na resolução solicitada.

No entanto, aumentar uma imagem raster fazendo com que ela contenha mais pixels não adiciona informações reais a ela e apenas adiciona 'qualidade' a ela, o que é fictício. Podeolharmais agradável ao olho humano se o seu algoritmo de aumento de escala for 'bom'. E ficará feio se você apenas duplicar, triplicar ou quadruplicar os pixels existentes, como fazem alguns algoritmos simples.

Para imagens rasterizadas,
a configuração de DPI só é relevante no contexto deimpressãoouexibindoisto. Porque impressoras ou monitores deram resoluções fixas. Portanto, são informações que apenas...

  • ...um driver de impressora ou
  • ...um aplicativo de processamento de imagem que suporta impressão

precisa saber.

EDocumentação do ImageMagickestá de pleno acordo comigo:

-density width
-density widthxheight
Defina a resolução horizontal e vertical de uma imagem para renderização para dispositivos.

Para imagens vetoriais ou formatos de arquivo
(como PDF ou PostScript), a configuração de DPI, entretanto, é extremamente importante no contexto derasterizaçãoeles. Um DPI mais alto transferirá mais informações da imagem para o formato raster e, portanto, preservará mais detalhes da qualidade original real. Ao converter uma imagem vetorial de um determinado tamanho em mm, cmou inchem raster com um DPI mais alto, isso se traduzirá diretamente em um número maior de pixels totais na imagem.

Além disso, o ImageMagick não suporta 'impressão' como tal. Em vez disso, apenas o ImageMagick...

  • ...converte arquivos de um determinado formato raster para outros formatos raster;
  • ...ou reduz ou aumenta imagens raster;
  • ...ou altera os valores das cores de acordo com um algoritmo específico;
  • ...ou recorta imagens, sobrepõe-nas, inverte-as, espelha-as;
  • ...e o que não....

...mas para imprimir as imagens manipuladas é necessário utilizar um programa diferente.

Alguns formatos de imagem (TIFF, PNG,...) suportam o armazenamento interno de uma configuração de DPI em seus metadados.

Mas isso não passa de um atributo de 'dica' que não altera a imagem raster subjacente. Essa é a razão pela qual você fez esta descoberta:

"Quando eu verifico o arquivo, ele permanece o mesmo."

Esta 'dica' pode ser avaliada automaticamente por drivers de impressora ou por programas de criação de páginas como o LaTeX. Na ausência de tais 'dicas' de DPI (ou se elas de alguma forma não se apresentam da maneira que o LaTeX espera que façam), o LaTeX ainda deve ser capaz de ser comandado para renderizar qualquer imagem em uma página da maneira que se espera. para - é necessário apenas um código LaTeX mais explícito em torno da imagem!

Alguns outros formatos de imagem (JPEG(?), BMP,...) nem sequer suportam o armazenamento de uma dica de DPI em seus metadados internos.

Portanto, o Gimp só suporta o que você vê em "Imagem -> Tamanho de impressão" porque deseja imprimir uma imagem. Com o ImageMagick você não pode imprimir.

Continue fazendo o que quiser com o Gimp ao imprimir. Não faz sentido com o ImageMagick.

Veja tambémeste trecho adicional de documentação de IM, que explica o mesmo tópico em palavras diferentes.


Então o que resta é isto:

  • Se você 'manipular' sua imagem com o Gimp e depois incorporar o resultado no LaTeX, a página terá a aparência esperada.
  • Se você 'manipular' sua imagem com ImageMagick e depois incorporar o resultado em LaTeX, a página pareceránãocomo você espera.

Forneça o seguinte para resolver o problema acima:

  • a versão exata da instalação do ImageMagick (saída completa de convert -versione convert -list configure);
  • (um link para uma) imagem de amostra original;
  • (um link para a) mesma imagem manipulada pelo Gimp;
  • (um link para a) mesma imagem manipulada pelo ImageMagick.

Desta forma podemos ajudar a resolver o problema.

Mas observe: este é um problema diferente do que seu assunto/título atual pergunta:"Quero alterar o DPI com o Imagemagick sem alterar o tamanho real dos bytes dos dados da imagem"


Atualizar

Já que éaindanão está claro para alguns leitores o que observei acima, aqui está mais uma tentativa...

Tudo o que é notado como'Resolução'ou'Densidade'dentro de um arquivo de imagem, é umatributo de metadados. Não tem influência sobre o número de pixels reais descritos pelo arquivo e é completamente irrelevante a este respeito. É apenas umdicaque um dispositivo de impressão ou renderização ou um aplicativo podeou não podesiga ao imprimir, renderizar ou exibir a imagem.

Para isso, são apenas alguns números armazenados no arquivo de imagem. Esses números informam aos dispositivos de saída, como impressoras, e exibem em quantos pontos (ou pixels) por polegada a imagem deve ser exibida. Para formatos vetoriais como PostScript, PDF, MWF e SVG, ele informa à escala de pixels para desenhar quaisquer coordenadas do mundo real usadas pela imagem.

Um exemplo, onde o valor de resolução anotado pelo ImageMagick dentro dos metadados da imagem éNÃOhomenageado por um aplicativo é o Adobe Photoshop. O Photoshop armazena suas dicas sobre a resolução desejada de impressão ou exibição em um perfil proprietário denominado8bim. O ImageMagick não altera esse perfil, mesmo quando solicitado a gravar uma alteração de resolução nos metadados de um arquivo de imagem. O Photoshop, por outro lado, irá ignorar todas as dicas de resolução armazenadas pelo ImageMagick no campo de metadados padrão definido para esse propósito assim que ele vir seu próprio8bimperfil.

O OP deveria ter escolhido o título:

  • 'Quero alterar o DPI (dica de resolução de metadados) com ImageMagick sem alterar o número real de pixels na imagem'

para evitar todos os mal-entendidos...

informação relacionada