{"id":40,"date":"2008-11-19T23:29:05","date_gmt":"2008-11-19T23:29:05","guid":{"rendered":"http:\/\/suspensaodedescrenca.wordpress.com\/?p=40"},"modified":"2008-11-19T23:29:05","modified_gmt":"2008-11-19T23:29:05","slug":"dividindo-uma-imagem-em-varias-paginas-com-imagemagick","status":"publish","type":"post","link":"https:\/\/suspensao.blog.br\/descrenca\/dividindo-uma-imagem-em-varias-paginas-com-imagemagick\/","title":{"rendered":"Dividindo uma imagem em v\u00e1rias p\u00e1ginas com ImageMagick"},"content":{"rendered":"<p>Esses dias, <a title=\"Thiago Mata\" href=\"http:\/\/thiagomata.blogspot.com\/\">um amigo<\/a> me pergunta no <a title=\"Google Talk - Chat online and make free Internet calls\" href=\"http:\/\/www.google.com\/talk\/\">Google Talk<\/a>:<\/p>\n<blockquote><p>duvida de linux<br \/>\ntenho uma imagem<br \/>\nbem grande<br \/>\ne quero que ela seja impressa<br \/>\nem varias paginas<br \/>\ntipo um pedaco numa pagina<br \/>\noutro pedaco em outra<\/p><\/blockquote>\n<p>(Antes de prosseguir, uma nota: uma imagem nos formatos JPEG, PNG etc. n\u00e3o possui um <em>tamanho<\/em>, mas sim uma <em>resolu\u00e7\u00e3o<\/em>. Assim, voc\u00ea pode exibir a imagem em qualquer tamanho, mas a resolu\u00e7\u00e3o provavelmente vai impor limites \u00e0 qualidade da imagem. Do mesmo modo, uma imagem de, digamos 1900 x 1200 <em>pixels<\/em> n\u00e3o tem um tamanho definido, mas sim uma resolu\u00e7\u00e3o, e pode ser impressa tanto numa folha A3, folha A4 ou qualquer outra, variando apenas a qualidade da impress\u00e3o.)<\/p>\n<p>Quando algu\u00e9m me fala de processar imagens no Linux, a primeira coisa que me vem a mente \u00e9 a su\u00edte <a title=\"Convert, Edit, and Compose Images\" href=\"http:\/\/www.imagemagick.org\/script\/index.php\">ImageMagick<\/a>. Entre as ferramentas do ImageMagick, a que mais uso \u00e9 o <a title=\"convert\" href=\"http:\/\/www.imagemagick.org\/script\/convert.php\"><code>convert<\/code><\/a>, um programa de linha de comando que permite executar in\u00fameras opera\u00e7\u00f5es sobre imagens, como converter de formato, redimensionar, gerar negativo, extrair um peda\u00e7o etc. etc.<\/p>\n<p>A minha abordagem seria, ent\u00e3o, dividir a imagem em pequenas imagens cont\u00edguas e retangulares. Para imprimir numa folha A4, por exemplo, as pequenas imagens deveriam ter propor\u00e7\u00f5es de uma folha A4. Como fazer isso?<\/p>\n<p>O primeiro passo \u00e9 descobrir como recuperar um ret\u00e2ngulo de uma imagem. Isto \u00e9 bem simples com o <code>convert<\/code>, basta utilizar a op\u00e7\u00e3o <a title=\"-crop\" href=\"http:\/\/www.imagemagick.org\/script\/command-line-options.php#crop\"><code>-crop<\/code><\/a>. Para nossa miss\u00e3o, n\u00f3s usaremos essa op\u00e7\u00e3o com uma <em>string<\/em> na forma<\/p>\n<blockquote><p><code><em>&lt;width&gt;<\/em>x<em>&lt;height&gt;<\/em>+<em>&lt;x&gt;<\/em>+<em>&lt;y&gt;<\/em><\/code><\/p><\/blockquote>\n<p>onde <code><em>&lt;width&gt;<\/em><\/code> \u00e9 a largura da imagem resultante, em <em>pixels<\/em>; <code><em>&lt;height&gt;<\/em><\/code> \u00e9 a altura da imagem resultante, em <em>pixels<\/em>; <code><em>&lt;x&gt;<\/em><\/code> e <code><em>&lt;y&gt;<\/em><\/code> s\u00e3o as coordenadas do <em>pixel<\/em> a partir de onde a imagem ser\u00e1 cortada. Desse modo, se quisermos extrair um ret\u00e2ngulo de 100 x 100 <em>pixels<\/em> de uma figura no arquivo <code>lena.png<\/code> de 512 x 512 <em>pixels<\/em> a partir do centro, far\u00edamos algo como<\/p>\n<blockquote><p><code>convert -crop 100x100+256+256 lena.png output.png<\/code><\/p><\/blockquote>\n<p>Se a imagem for essa:<\/p>\n<div id=\"attachment_41\" style=\"width: 460px\" class=\"wp-caption aligncenter\"><a href=\"http:\/\/www.cs.cmu.edu\/~chuck\/lennapg\/\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-41\" data-attachment-id=\"41\" data-permalink=\"https:\/\/suspensao.blog.br\/descrenca\/dividindo-uma-imagem-em-varias-paginas-com-imagemagick\/lena\/\" data-orig-file=\"https:\/\/i0.wp.com\/suspensao.blog.br\/descrenca\/wp-content\/uploads\/2008\/11\/lena.png?fit=512%2C512&amp;ssl=1\" data-orig-size=\"512,512\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;}\" data-image-title=\"Lena S\u00f6derberg\" data-image-description=\"&lt;p&gt;Reconhece essa foto?&lt;\/p&gt;\n\" data-image-caption=\"&lt;p&gt;Lena S\u00f6derberg, SFW&lt;\/p&gt;\n\" data-medium-file=\"https:\/\/i0.wp.com\/suspensao.blog.br\/descrenca\/wp-content\/uploads\/2008\/11\/lena.png?fit=300%2C300&amp;ssl=1\" data-large-file=\"https:\/\/i0.wp.com\/suspensao.blog.br\/descrenca\/wp-content\/uploads\/2008\/11\/lena.png?fit=512%2C512&amp;ssl=1\" class=\"size-full wp-image-41\" title=\"Lena S\u00f6derberg\" src=\"http:\/\/suspensaodedescrenca.files.wordpress.com\/2008\/11\/lena.png?resize=450%2C450\" alt=\"Lena S\u00f6derberg, SFW\" width=\"450\" height=\"450\" srcset=\"https:\/\/i0.wp.com\/suspensao.blog.br\/descrenca\/wp-content\/uploads\/2008\/11\/lena.png?w=512&amp;ssl=1 512w, https:\/\/i0.wp.com\/suspensao.blog.br\/descrenca\/wp-content\/uploads\/2008\/11\/lena.png?resize=150%2C150&amp;ssl=1 150w, https:\/\/i0.wp.com\/suspensao.blog.br\/descrenca\/wp-content\/uploads\/2008\/11\/lena.png?resize=300%2C300&amp;ssl=1 300w\" sizes=\"auto, (max-width: 450px) 100vw, 450px\" \/><\/a><p id=\"caption-attachment-41\" class=\"wp-caption-text\">Lena S\u00f6derberg, SFW<\/p><\/div>\n<p>o resultado do comando acima ser\u00e1:<\/p>\n<div id=\"attachment_42\" style=\"width: 110px\" class=\"wp-caption aligncenter\"><a href=\"http:\/\/suspensaodedescrenca.files.wordpress.com\/2008\/11\/output.png\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-42\" data-attachment-id=\"42\" data-permalink=\"https:\/\/suspensao.blog.br\/descrenca\/dividindo-uma-imagem-em-varias-paginas-com-imagemagick\/output\/\" data-orig-file=\"https:\/\/i0.wp.com\/suspensao.blog.br\/descrenca\/wp-content\/uploads\/2008\/11\/output.png?fit=100%2C100&amp;ssl=1\" data-orig-size=\"100,100\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;}\" data-image-title=\"Lena S\u00f6derberg, a partir do centro\" data-image-description=\"\" data-image-caption=\"&lt;p&gt;Resultado do corte da imagem&lt;\/p&gt;\n\" data-medium-file=\"https:\/\/i0.wp.com\/suspensao.blog.br\/descrenca\/wp-content\/uploads\/2008\/11\/output.png?fit=100%2C100&amp;ssl=1\" data-large-file=\"https:\/\/i0.wp.com\/suspensao.blog.br\/descrenca\/wp-content\/uploads\/2008\/11\/output.png?fit=100%2C100&amp;ssl=1\" class=\"size-full wp-image-42\" title=\"Lena S\u00f6derberg, a partir do centro\" src=\"http:\/\/suspensaodedescrenca.files.wordpress.com\/2008\/11\/output.png?resize=100%2C100\" alt=\"Resultado do corte da imagem\" width=\"100\" height=\"100\" \/><\/a><p id=\"caption-attachment-42\" class=\"wp-caption-text\">Resultado do corte da imagem<\/p><\/div>\n<p>(Note que a op\u00e7\u00e3o <code>-crop<\/code> pode ser utilizada de outras maneiras. Confira na <a title=\"-crop\" href=\"http:\/\/www.imagemagick.org\/script\/command-line-options.php#crop\">documenta\u00e7\u00e3o da op\u00e7\u00e3o<\/a>.)<\/p>\n<p>Agora, precisamos gerar v\u00e1rias imagens a partir da primeira. Para n\u00e3o ficar fazendo isso na m\u00e3o, podemos usar o comando <code>for<\/code> junto com o comando <code>seq<\/code>. (Se voc\u00ea n\u00e3o sabe usar o comando <code>for<\/code> e o comando <code>seq<\/code> do <em>bash<\/em>, <a href=\"http:\/\/tldp.org\/HOWTO\/Bash-Prog-Intro-HOWTO-7.html\">essa p\u00e1gina<\/a> explica muito bem como funcionam.) Desse modo, se eu quisesse dividir a imagem da Lena acima em ret\u00e2ngulos de 100 x 200 <em>pixels<\/em>, eu faria algo como:<\/p>\n<blockquote>\n<pre>for i in `seq 0 $((512\/100))`; do\n    for j in `seq 0 $((512\/200))`; do\n        convert -crop 100x200+$((i*100))+$((j*200)) \n            lena.png lena-$j-$i.png\n    done\ndone<\/pre>\n<\/blockquote>\n<p>Estou dividindo a imagem numa planilha de imagens. Para cada linha, eu vou gerar 512\/100 +1 = 6 imagens; para cada coluna, eu vou gerar 512\/200 +1 = 3 imagens. (Se voc\u00ea n\u00e3o entendeu o &#8220;+1&#8221;, lembre-se que estamos contando <em>a partir de zero<\/em>, como em C, Java etc). A primeira imagem ser\u00e1 o ret\u00e2ngulo que vai do <em>pixel <\/em>de coordenada (0, 0) at\u00e9 o <em>pixel<\/em> de coordenada (100, 200); a segunda imagem ir\u00e1 do <em>pixel<\/em> de coordenada (100, 0) at\u00e9 o <em>pixel<\/em> de coordenada (200, 200); do mesmo modo, a primeira imagem da linha abaixo ir\u00e1 do <em>pixel<\/em> de coordenada (0, 200) at\u00e9 o <em>pixel<\/em> de coordenada (100, 400) etc. etc., contando as coordenadas a partir do canto superior esquerdo.<\/p>\n<p>Ao rodar isso, gerei dezoito imagens. O resultado, que uni em uma imagem s\u00f3 por praticidade, pode ser visto abaixo. As linhas brancas separam as imagens geradas.<\/p>\n<div id=\"attachment_45\" style=\"width: 460px\" class=\"wp-caption aligncenter\"><a href=\"http:\/\/suspensaodedescrenca.files.wordpress.com\/2008\/11\/lenna-splitted.png\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-45\" data-attachment-id=\"45\" data-permalink=\"https:\/\/suspensao.blog.br\/descrenca\/dividindo-uma-imagem-em-varias-paginas-com-imagemagick\/lenna-splitted\/\" data-orig-file=\"https:\/\/i0.wp.com\/suspensao.blog.br\/descrenca\/wp-content\/uploads\/2008\/11\/lenna-splitted.png?fit=551%2C528&amp;ssl=1\" data-orig-size=\"551,528\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;}\" data-image-title=\"Imagens da Lena\" data-image-description=\"&lt;p&gt;Rodei o &lt;em&gt;script&lt;\/em&gt; apresentado e o resultado foi esse. Juntei as imagens no GIMP, apenas para facilitar.&lt;\/p&gt;\n\" data-image-caption=\"&lt;p&gt;A borda branca separa as in\u00fameras imagens que foram geradas&lt;\/p&gt;\n\" data-medium-file=\"https:\/\/i0.wp.com\/suspensao.blog.br\/descrenca\/wp-content\/uploads\/2008\/11\/lenna-splitted.png?fit=300%2C287&amp;ssl=1\" data-large-file=\"https:\/\/i0.wp.com\/suspensao.blog.br\/descrenca\/wp-content\/uploads\/2008\/11\/lenna-splitted.png?fit=551%2C528&amp;ssl=1\" class=\"size-full wp-image-45\" title=\"As linhas brancas separam as imagens que foram geradas\" src=\"http:\/\/suspensaodedescrenca.files.wordpress.com\/2008\/11\/lenna-splitted.png?resize=450%2C431\" alt=\"A borda branca separa as in\u00fameras imagens que foram geradas\" width=\"450\" height=\"431\" srcset=\"https:\/\/i0.wp.com\/suspensao.blog.br\/descrenca\/wp-content\/uploads\/2008\/11\/lenna-splitted.png?w=551&amp;ssl=1 551w, https:\/\/i0.wp.com\/suspensao.blog.br\/descrenca\/wp-content\/uploads\/2008\/11\/lenna-splitted.png?resize=300%2C287&amp;ssl=1 300w, https:\/\/i0.wp.com\/suspensao.blog.br\/descrenca\/wp-content\/uploads\/2008\/11\/lenna-splitted.png?resize=313%2C300&amp;ssl=1 313w\" sizes=\"auto, (max-width: 450px) 100vw, 450px\" \/><\/a><p id=\"caption-attachment-45\" class=\"wp-caption-text\">Lena, dividida<\/p><\/div>\n<p>(Note como o <code>convert<\/code>, ao encontrar um ret\u00e2ngulo com um peda\u00e7o vazio, gera a maior figura poss\u00edvel. Isso pode ser notado nas bordas direita e inferior.)<\/p>\n<p>Vamos generalizar o algoritmo. Faremos um <em>script<\/em> que recebe como par\u00e2metro as dimens\u00f5es originais do arquivo, as dimens\u00f5es das imagens a serem geradas e o nome do arquivo original. O resultado ser\u00e1 algo como<\/p>\n<blockquote>\n<pre>file=$1\noriginalx=$2\noriginaly=$3\nslicex=$4\nslicey=$5\nnumberx=$((originalx\/slicex))\nnumbery=$((originaly\/slicey))\n\nfor i in `seq 0 $numberx`; do\n  for j in `seq 0 $numbery`; do\n    convert -crop ${slicex}x${slicey}+$((i*slicex))+$((j*slicey)) \n        $file $file-$j-$i.png\n  done\ndone<\/pre>\n<\/blockquote>\n<p>Agora, \u00e9 s\u00f3 rodar o <em>script<\/em> dando como argumentos as dimens\u00f5es originais e algumas dimens\u00f5es proporcionais ao papel que queremos utilizar. Obteremos imagens que caber\u00e3o perfeitamente no papel. (Vale lembrar que uma imagem n\u00e3o tem um tamanho em si, mas uma resolu\u00e7\u00e3o: a qualidade final pode n\u00e3o ficar muito boa, dependendo da resolu\u00e7\u00e3o da sua imagem.)<\/p>\n<p>Para facilitar o trabalho, vamos juntar todas as imagens em um \u00fanico arquivo PDF, o que facilitaria a impress\u00e3o. O <code>convert<\/code> do ImageMagick pode fazer isso de maneira bem simples: se invocarmos o\u00a0 <code>convert<\/code> passando como par\u00e2metro uma s\u00e9rie de imagens e, ao final, o nome de um arquivo com extens\u00e3o <code>.pdf<\/code>, o resultado ser\u00e1 um arquivo PDF com uma imagem por p\u00e1gina. Assim sendo, ao chamar algo como<\/p>\n<blockquote><p><code>convert fig1.png fig2.png fig3.png one-per-page.pdf<\/code><\/p><\/blockquote>\n<p><code>one-per-page.pdf<\/code> vai conter, ao vai conter, ao final, tr\u00eas p\u00e1ginas. Na primeira, estar\u00e1 <code>fig1.png<\/code>; na segunda, teremos <code>fig2.png<\/code> e, na terceira p\u00e1gina, estar\u00e1 <code>fig3.png<\/code>.<\/p>\n<p>Assim, vamos complementar o <em>script<\/em> criando uma vari\u00e1vel que armazena o nome de todos os arquivos gerados (separados por um espa\u00e7o em branco). Ap\u00f3s gerar todas as imagens, vamos coloc\u00e1-las todas em um arquivo PDF. O <em>script<\/em> final, voc\u00ea pode v\u00ea-lo no <a title=\"Bash pastebin - collaborative debugging tool\" href=\"http:\/\/pastebin.com\/f55dad818\">pastebin<\/a>.<\/p>\n<p>Eu apliquei o <em>script<\/em> sobre nossa imagem, usando as dimens\u00f5es proporcionais a papel <a title=\"A4 (tamanho de papel) - Wikip\u00e9dia, a enciclop\u00e9dia livre\" href=\"http:\/\/pt.wikipedia.org\/wiki\/A4_(tamanho_de_papel)\">A4<\/a> (210 x 297 mm):<\/p>\n<blockquote><p><code> .\/split.sh lena.png 512 512 210 297<\/code><\/p><\/blockquote>\n<p>O resultado pode ser encontrado <a title=\"lena.png.pdf\" href=\"http:\/\/brandizzi.googlepages.com\/lena.png.pdf\">aqui<\/a>. As p\u00e1ginas acabaram em formato A7, mas, se mandar imprimir, elas preencher\u00e3o toda a folha A4 sem problemas.<\/p>\n<p>O <em>script<\/em> est\u00e1 dispon\u00edvel para quem quiser fazer qualquer uso dele. Ademais, pode ser melhorado: \u00e9 poss\u00edvel, por exemplo, fazer com que o ImageMagick descubra ele mesmo as dimens\u00f5es iniciais da imagem. Entretanto, acredito que ele j\u00e1 possa ser bem \u00fatil<\/p>\n<p>Obrigado, Renan Mendes, pela dica sobre como gerar PDFs. A todos, at\u00e9 mais!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Esses dias, um amigo me pergunta no Google Talk: duvida de linux tenho uma imagem bem grande e quero que ela seja impressa em varias paginas tipo um pedaco numa pagina outro pedaco em outra (Antes de prosseguir, uma nota: uma imagem nos formatos JPEG, PNG etc. n\u00e3o possui um tamanho, mas sim uma resolu\u00e7\u00e3o. [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":false,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2}},"categories":[10,15],"tags":[45,48,57],"class_list":["post-40","post","type-post","status-publish","format-standard","hentry","category-linux","category-scripting","tag-imagemagick","tag-lena-soderberg","tag-processamento-de-imagens"],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"","jetpack_shortlink":"https:\/\/wp.me\/p23QLV-E","jetpack_sharing_enabled":true,"jetpack_likes_enabled":true,"jetpack-related-posts":[],"_links":{"self":[{"href":"https:\/\/suspensao.blog.br\/descrenca\/wp-json\/wp\/v2\/posts\/40","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/suspensao.blog.br\/descrenca\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/suspensao.blog.br\/descrenca\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/suspensao.blog.br\/descrenca\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/suspensao.blog.br\/descrenca\/wp-json\/wp\/v2\/comments?post=40"}],"version-history":[{"count":0,"href":"https:\/\/suspensao.blog.br\/descrenca\/wp-json\/wp\/v2\/posts\/40\/revisions"}],"wp:attachment":[{"href":"https:\/\/suspensao.blog.br\/descrenca\/wp-json\/wp\/v2\/media?parent=40"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/suspensao.blog.br\/descrenca\/wp-json\/wp\/v2\/categories?post=40"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/suspensao.blog.br\/descrenca\/wp-json\/wp\/v2\/tags?post=40"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}