Imagemagick – matoken's meme https://matoken.org/blog Fri, 18 Oct 2024 17:12:03 +0000 ja hourly 1 https://wordpress.org/?v=6.7.2 ImageMagickの内蔵画像を確認 https://matoken.org/blog/2024/10/19/check-imagemagicks-built-in-images/ https://matoken.org/blog/2024/10/19/check-imagemagicks-built-in-images/#respond Fri, 18 Oct 2024 21:07:00 +0000 https://matoken.org/blog/?p=4148

端末の Sixel の動作確認によくこんな感じで ImageMagick 内蔵の rose: を使っています.

$ convert rose: - | sixelv -

imagemagick rose2sixel

この内蔵組み込み画像は他にもないかなと探してみました.

検索すると以下のページを見つけました.

Built-in image というようです.以下のコマンドで一覧が確認できます.大文字で出てきますが,大文字でも小文字でも OK そうです.( H は Built-in image ではない.)

$ convert -list coder | grep MAGICK
GRANITE     MAGICK
H           MAGICK
LOGO        MAGICK
NETSCAPE    MAGICK
ROSE        MAGICK
WIZARD      MAGICK
$ montage -label "%i" -tile 3 -geometry 200 GRANITE: LOGO: NETSCAPE: ROSE: WIZARD: - | sixelv -

imagemagick built in image

rose/logo 辺りが覚えやすくていいですね.後は用途別に使うと良さそうです.

環境
$ dpkg-query -W imagemagick
imagemagick     8:6.9.13.12+dfsg1-1+b1
$ sixelv --version
sixelv 3.8.1 (2024/09/21) - SIXEL viewer
 Supported loader: blurhash, libwebp, stb_image
$ lsb_release -dr
Description:    Debian GNU/Linux trixie/sid
Release:        n/a
$ arch
x86_64
]]>
https://matoken.org/blog/2024/10/19/check-imagemagicks-built-in-images/feed/ 0
jpeg 画像群を PDF ファイルに変換(ImageMagick, imgpdf) https://matoken.org/blog/2024/05/09/images-to-pdf/ https://matoken.org/blog/2024/05/09/images-to-pdf/#respond Thu, 09 May 2024 10:16:12 +0000 https://matoken.org/blog/?p=4023

先日国立国会図書館デジタルコレクションの蔵書の画像をダウンロードして余白をカットして読みやすくしました.jpeg を zip アーカイブにまとめたのですが,PDF ファイルのほうが都合がいいことも.ということで jpeg ファイル群を PDF ファイルに変換しました.

ImageMagick の convert コマンドを使うとメモリ不足で失敗,ポリシーファイルの /etc/ImageMagick-6/policy.xml でメモリリソースを 1GB から 4GB に設定しても失敗して8GB に設定してやっと処理が出来ました.

$ convert  2530201/* 宇宙船ビーグル号の冒険.pdf (1)
  :
convert-im6.q16: cache resources exhausted `2530201/2530201-107.jpg' @ error/cache.c/OpenPixelCache/4119.
convert-im6.q16: TooManyExceptions (exception processing is suspended) @ warning/exception.c/ThrowException/1054.
convert-im6.q16: cache resources exhausted `2530201/2530201-108.jpg' @ error/cache.c/OpenPixelCache/4119.
$ identify -list resource (2)
Resource limits:
  Width: 32KP
  Height: 32KP
  List length: unlimited
  Area: 256MP
  Memory: 1GiB
  Map: 2GiB
  Disk: 2GiB
  File: 768
  Thread: 4
  Throttle: 0
  Time: unlimited
$ identify -limit memory 4096MiB -list resource | grep ^\ \ Memory: (3)
  Memory: 1GiB
$ identify -limit memory 512MiB -list resource | grep ^\ \ Memory: (4)
  Memory: 512MiB
$ sudo git -C /etc diff /etc/ImageMagick-6/policy.xml (5)
diff --git a/ImageMagick-6/policy.xml b/ImageMagick-6/policy.xml
index 4b878ce..aa54cbe 100644
--- a/ImageMagick-6/policy.xml
+++ b/ImageMagick-6/policy.xml
@@ -95,7 +95,7 @@
   <!-- Set maximum amount of memory in bytes to allocate for the pixel cache
        from the heap. When this limit is exceeded, the image pixels are cached
        to memory-mapped disk. -->
-  <policy domain="resource" name="memory" value="1024MiB"/>
+  <policy domain="resource" name="memory" value="4096MiB"/>
   <!-- Set maximum amount of memory map in bytes to allocate for the pixel
        cache. When this limit is exceeded, the image pixels are cached to
        disk. -->
$ identify -list resource | grep ^\ \ Memory: (6)
  Memory: 4GiB
  1. ImageMagick の convert コマンドで PDF ファイルに変換したが途中で失敗
  2. ImageMagick の リソースを確認
  3. limit memory で大きくは出来ない
  4. limit memory で小さくは出来る
  5. ImageMagick のポリシーファイルを編集してメモリ利用可能量を増やした
  6. メモリ利用可能量が増えたのを確認

いちおうこれで返還でしましたが,このメモリ利用量と変換時間は大きすぎるので他の方法を探しました.

img2pdf というコマンドを見つけました.このコマンドは可能ならロスレスで画像を PDF ファイルに変換してくれるので高速(かつ省リソースなはず)で処理できそうです.

導入はディストリビューションパッケージから.実行速度もとても早かったです.

$ sudo apt install img2pdf (1)
$ img2pdf -o 宇宙船ビーグル号の冒険-img2pdf.pdf 2530201/* (2)
find 2530201 -type f -print0 | sort -Vz | xargs -0 img2pdf -o 宇宙船ビーグル号の冒険.pdf (3)
  1. img2pdf パッケージを導入
  2. PDF に変換
  3. 画像ファイル名で並べ替えて標準入力から画像ファイルリストを渡し,PDF ファイルに

変換時間の比較です.convert が異様に遅いですが,これはスワップを使ってしまっているのも大きいと思われ,メモリの大きいマシンだともっと早くなると思います.

$ time convert 2530201/* 宇宙船ビーグル号の冒険.pdf

real    5m18.636s
user    0m47.748s
sys     0m31.136s
$ time img2pdf -o 宇宙船ビーグル号の冒険-img2pdf.pdf 2530201/*

real    0m1.279s
user    0m0.556s
sys     0m0.180s

実際の画像も特に問題なさそうだし,ファイルサイズもほとんど変わりませんでした.

単純に画像を PDF ファイルに変換する時は img2pdf コマンドを使うのが良さそうです.

環境
$ dpkg-query -W imagemagick img2pdf
imagemagick     8:6.9.12.98+dfsg1-5.2
img2pdf 0.5.1-1
$ lsb_release -a
No LSB modules are available.
Distributor ID: Debian
Description:    Debian GNU/Linux trixie/sid
Release:        n/a
Codename:       trixie
$ arch
x86_64
]]>
https://matoken.org/blog/2024/05/09/images-to-pdf/feed/ 0
国立国会図書館デジタルコレクションの蔵書の画像の余白を削除して読みやすくする https://matoken.org/blog/2024/05/02/remove-image-margins/ https://matoken.org/blog/2024/05/02/remove-image-margins/#comments Thu, 02 May 2024 10:04:08 +0000 https://matoken.org/blog/?p=4014

国立国会図書館デジタルコレクションの蔵書をダウンロードしてローカルで読む際余白が邪魔なので消しました.

まず,十全に国立国会図書館デジタルコレクションを利用するためには国立国会図書館の利用者登録(個人)の本登録をしておきましょう.

現在は現地に行かずとも遠隔で本登録まで可能です.便利になりましたね.

国立国会図書館デジタルコレクション で読みたい本を検索,ログイン( 登録利用者ID,パスワード )
右下の印刷で印刷範囲を指定して「印刷ファイルを開く」で該当範囲の pdf ファイルを作成,
上部に 「ファイルを作成しています…」 のメッセージが表示され,しばらく待つと 「印刷用ファイルを作成しました。右のリンクからPDFファイルを表示できます。」に変わるので 「PDFファイルを開く」 からダウンロードします.

Note

50コマを超えている場合は「範囲を指定」で 1-50 のように範囲指定できる.
> 入力値が資料のコマ数を超過しています。
となったとき最大コマ数を調べて指定しなくても 150- のように指定して最後までダウンロードできるよう.

ダウンロードした PDF ファイルは下部に 登録利用者ID, 利用者名,生成年月日時分秒 が画像に埋め込まれています.

宇宙船ビーグル号の冒険

PDF ファイルはこんな感じでした.2481 x 1732.5 pts 50コマ(100ページ分)で37MB程.

$ pdfinfo digidepo_2530201_0001-001-050.pdf
Title:           宇宙船ビーグル号の冒険
Keywords:        A.E.ヴァン・ヴォークト 著 ほか『宇宙船ビーグル号の冒険』,東京創元社,1964.2(43刷:1999.10). 国立国会図書館デジタルコレクション https://dl.ndl.go.jp/pid/2530201 (参照 2024-05-02)
Author:          A.E.ヴァン・ヴォークト 著
Producer:        PyPDF2
CreationDate:    Thu May  2 00:30:21 2024 JST
ModDate:         Thu May  2 00:30:21 2024 JST
Custom Metadata: no
Metadata Stream: no
Tagged:          no
UserProperties:  no
Suspects:        no
Form:            none
JavaScript:      no
Pages:           50
Encrypted:       yes (print:yes copy:no change:no addNotes:no algorithm:AES-256)
Page size:       2481 x 1732.5 pts
Page rot:        0
File size:       36676525 bytes
Optimized:       no
PDF version:     1.7

Encrypted で print:yes copy:no change:no addNotes:no でパスワードもわからないので,tdftk は使えません.

Error: Invalid PDF: unknown.encryption.type.r
Error: Failed to open input PDF file:

print は出来るので mcomix でも読めます.ということで pdfimages で中の画像の取り出しは出来ました.

$ pdfimages -all digidepo_2530201_0001-001-050.pdf 2530201/2530201
$ ls 2530201/
2530201-000.jpg  2530201-004.jpg  2530201-008.jpg  2530201-012.jpg  2530201-016.jpg  2530201-020.jpg  2530201-024.jpg  2530201-028.jpg  2530201-032.jpg  2530201-036.jpg  2530201-040.jpg  2530201-044.jpg  2530201-048.jpg
2530201-001.jpg  2530201-005.jpg  2530201-009.jpg  2530201-013.jpg  2530201-017.jpg  2530201-021.jpg  2530201-025.jpg  2530201-029.jpg  2530201-033.jpg  2530201-037.jpg  2530201-041.jpg  2530201-045.jpg  2530201-049.jpg
2530201-002.jpg  2530201-006.jpg  2530201-010.jpg  2530201-014.jpg  2530201-018.jpg  2530201-022.jpg  2530201-026.jpg  2530201-030.jpg  2530201-034.jpg  2530201-038.jpg  2530201-042.jpg  2530201-046.jpg
2530201-003.jpg  2530201-007.jpg  2530201-011.jpg  2530201-015.jpg  2530201-019.jpg  2530201-023.jpg  2530201-027.jpg  2530201-031.jpg  2530201-035.jpg  2530201-039.jpg  2530201-043.jpg  2530201-047.jpg
$ file 2530201/2530201-001.jpg
2530201/2530201-001.jpg: JPEG image data, JFIF standard 1.01, aspect ratio, density 1x1, segment length 16, baseline, precision 8, 3308x2310, components 3

余白が気になるので Imagemagick の trim でカットします.正攻法だと座標を指定しますが,今回は fuzz で Imagemagick に頑張ってもらいます.
fuzz の % は画像により丁度いい値を探す必要があります.今回は 60% で良さそう.

$ convert 2530201/2530201-001.jpg -fuzz 60% -trim 2530201-001-trim.jpg

宇宙船ビーグル号の冒険 trim

余白がカットされ,3308×2310 → 2831×2099 になりました.いい感じそうなので mogrify で全画像に反映して1つのアーカイブにまとめました.

$ mogrify -fuzz 60% -trim 2530201/*
$ find 2530201 | sort -V | zip -@0 ./宇宙船ビーグル号の冒険.zip

50コマ以上の資料で,2つ以上のアーカイブの場合は2つ目以降の PDF を同様に変換を繰り返してアーカイブに追加します.ただ, pdfimages で生成されるファイル名が被ってしまうので rename コマンドなどでファイル名を変更します.

$ rm 2530201/* (1)
$ pdfimages -all ./digidepo_2530201_0001-051-100.pdf 2530201/2530201 (2)
$ rename 's/(\d+)-(\d+)/sprintf "$1-%03d",$2 + 50/e' 2530201/* (3)
$ mogrify -fuzz 60% -trim 2530201/* (4)
$ find 2530201 -print | sort -V | zip -@0 ./宇宙船ビーグル号の冒険.zip (5)
  1. 古いデータを削除
  2. PDF 画像を取り出し
  3. 連番部分を 50 加算したファイル名に改名
  4. 余白削除
  5. 非圧縮で zip アーカイブに追加

タブレット端末で MComix で閲覧するといい感じそうです.ちょっとサイズが大きいので縮小したり,互換性のために PDF 形式にしたりしても良さそうです.
スマホなどで読む場合はさらに真ん中から2分割したら良さそうですが,ざっと見た感じのどが中央に揃っているわけではないので少し面倒そうです.

環境
$ dpkg-query -W imagemagick zip poppler-utils rename
imagemagick     8:6.9.12.98+dfsg1-5.2
poppler-utils   22.12.0-2.2+b1
rename  2.02-1
zip     3.0-13
$ lsb_release -a
No LSB modules are available.
Distributor ID: Debian
Description:    Debian GNU/Linux trixie/sid
Release:        n/a
Codename:       trixie
$ arch
x86_64
]]>
https://matoken.org/blog/2024/05/02/remove-image-margins/feed/ 2
ImageMagickでpdfファイルの1ページ目だけをjpegにする https://matoken.org/blog/2021/03/16/make-the-first-page-of-the-pdf-file-jpeg-with-imagemagick/ https://matoken.org/blog/2021/03/16/make-the-first-page-of-the-pdf-file-jpeg-with-imagemagick/#respond Tue, 16 Mar 2021 14:25:28 +0000 http://matoken.org/blog/?p=3104

ImagemMgickのconvertコマンドでpdfをjpegにしようとするとエラーになってしまいました.でもこれは見覚えのあるエラー……どこかにメモした気がするのですが見当たらないのでblogにしてみました.

ImageMagickのセキュリティポリシーを変更してpdfファイルを変換できるようにする

$ convert -geometry 640 /var/tmp/Nextcloud2pdf_cache/HQeSTL5TgcgAPtS.pdf[0] /tmp/HQeSTL5TgcgAPtS.jpg
convert-im6.q16: attempt to perform an operation not allowed by the security policy `PDF' @ error/constitute.c/IsCoderAuthorized/408.
convert-im6.q16: no images defined `/tmp/HQeSTL5TgcgAPtS.jpg' @ error/convert.c/ConvertImageCommand/3258.

セキュリティの問題でImageMagickの設定で無効にしてあるのでこれを有効にします.

$ sudo git -C /etc diff /etc/ImageMagick-6/policy.xml
diff --git a/ImageMagick-6/policy.xml b/ImageMagick-6/policy.xml
index 82a3d0b..0953557 100644
--- a/ImageMagick-6/policy.xml
+++ b/ImageMagick-6/policy.xml
@@ -91,6 +91,6 @@
   <policy domain="coder" rights="none" pattern="PS2" />
   <policy domain="coder" rights="none" pattern="PS3" />
   <policy domain="coder" rights="none" pattern="EPS" />
-  <policy domain="coder" rights="none" pattern="PDF" />
+  <policy domain="coder" rights="read|write" pattern="PDF" />
   <policy domain="coder" rights="none" pattern="XPS" />
 </policymap>

設定を編集後実行するとうまく動きました :)

$ convert -geometry 640 /var/tmp/Nextcloud2pdf_cache/HQeSTL5TgcgAPtS.pdf[0] /tmp/HQeSTL5TgcgAPtS.jpg

pdfファイルの指定ページだけを変換する

ソースファイル名を普通に指定すると, ファイル名-%d.jpg のようなファイルが連番で作成されます.
今回は1ページめだけが欲しいので不必要なファイルがたくさん出来てしまいます.

1ページだけが欲しい場合, ソースファイル名.pdf[0] というようにページ指定して実現できます.この添字は1ページ目が0,2ページめが1のように指定します.

存在しないページ番号を指定するとエラーになります.

$ convert -geometry 640 /var/tmp/Nextcloud2pdf_cache/HQeSTL5TgcgAPtS.pdf[99] /tmp/HQeSTL5TgcgAPtS-99.jpg

Requested FirstPage is greater than the number of pages in the file: 33
   No pages will be processed (FirstPage > LastPage).
convert-im6.q16: no images defined `./HQeSTL5TgcgAPtS-1.jpg' @ error/convert.c/ConvertImageCommand/3258.
環境
$ dpkg-query -W imagemagick
imagemagick     8:6.9.10.23+dfsg-2.1+deb10u1
$ lsb_release -dr
Description:    Debian GNU/Linux 10 (buster)
Release:        10
$ uname -m
x86_64
]]>
https://matoken.org/blog/2021/03/16/make-the-first-page-of-the-pdf-file-jpeg-with-imagemagick/feed/ 0
Imagemagickで画像変換時にキャッシュリソースが足りなくて転ける https://matoken.org/blog/2019/10/20/imagemagick-fails-due-to-lack-of-cache-resources-when-converting-images/ https://matoken.org/blog/2019/10/20/imagemagick-fails-due-to-lack-of-cache-resources-when-converting-images/#respond Sat, 19 Oct 2019 15:40:53 +0000 http://matoken.org/blog/?p=2601

Google Photoにheic形式でファイルをアップロードすると「高画質」(16MPに縮小される)設定でも縮小されないようなのでどのくらいのサイズまでOKなのかを試していたのですが,倍々で画像結合していたら128MPほどのファイル作成時に失敗しました.

$ convert -append out.heic out.heic out128.heic
convert-im6.q16: cache resources exhausted `out.heic' @ error/cache.c/OpenPixelCache/4083.

処理しているファイルは無駄にでかいです.

$ identify ./out.heic
./out.heic HEIC 9884x6552 9884x6552+0+0 8-bit YCbCr 0.020u 0:00.010

このあたりのページを参考にポリシーファイルを修正してメモリを増やしてみます.

$ sudo git -C /etc diff /etc/ImageMagick-6/policy.xml
diff --git a/ImageMagick-6/policy.xml b/ImageMagick-6/policy.xml
index 59d2fc6..4c6d088 100644
--- a/ImageMagick-6/policy.xml
+++ b/ImageMagick-6/policy.xml
@@ -57,8 +57,8 @@
   <!-- <policy domain="system" name="memory-map" value="anonymous"/> -->
   <!-- <policy domain="system" name="max-memory-request" value="256MiB"/> -->
   <!-- <policy domain="resource" name="temporary-path" value="/tmp"/> -->
-  <policy domain="resource" name="memory" value="256MiB"/>
-  <policy domain="resource" name="map" value="512MiB"/>
+  <policy domain="resource" name="memory" value="2048MiB"/>
+  <policy domain="resource" name="map" value="4096MiB"/>
   <policy domain="resource" name="width" value="16KP"/>
   <policy domain="resource" name="height" value="16KP"/>
   <!-- <policy domain="resource" name="list-length" value="128"/> -->

うまく行くようになりました :)

$ time convert -append out.heic out.heic out128.heic; echo $?

real    2m33.128s
user    6m42.527s
sys     0m4.704s
0
$ ls -l out128.heic
-rw-r--r-- 1 matoken matoken 4286359 Oct 20 00:30 out128.heic
$ identify out128.heic
out128.heic HEIC 9884x13104 9884x13104+0+0 8-bit YCbCr 0.000u 0:00.010

でも割り当て過ぎな気もするのでも少し減らそう.

$ dpkg-query -W imagemagick
imagemagick     8:6.9.10.23+dfsg-2.1+b2
$ lsb_release -dr
Description:    Debian GNU/Linux bullseye/sid
Release:        unstable
$ uname -m
x86_64
]]>
https://matoken.org/blog/2019/10/20/imagemagick-fails-due-to-lack-of-cache-resources-when-converting-images/feed/ 0
Mailmanのban_listを画像にする https://matoken.org/blog/2018/07/12/mailmans-ban_list-as-image/ https://matoken.org/blog/2018/07/12/mailmans-ban_list-as-image/#respond Thu, 12 Jul 2018 12:12:22 +0000 http://matoken.org/blog/?p=1993 最近Mailmanにbotからであろう登録が沢山やってくるようになりました.登録メールアドレスは大抵メジャーなフリーメールアドレスで生きているようなのですが,quotaや転送量のエラーとなって帰ってきます.これらのエラーメールでメールボックスがあふれて辛いです.

Mailmanにcaptchaか何かを設置できるプラグインとか無いかなと探してみたのですが,公式ではないようです.sourceを修正してGoogleのReCaptchaを実装している人は居ますが,バージョンアップのたびにパッチするのは面倒です.最近もセキュリティホールが見つかっていますし放置するわけにも生きません.

該当メールを見ると幸いメールアドレスは使い回しでバリエーションは多くありません.とりあえずMailmanのban_listにこれらのメールアドレスを登録してmailqに溜まっている該当メールはdropしました.1週間くらいしたらリモートからのエラーメールも無くなって静かになると良いなと思っています.
ban_listに登録しましたが,もしかしたらbotではなく普通に登録しようとしてメールボックスがあふれている人も居るかもしれません.それが解るようにban_listを申し込みページに表示することにしました.そのまま表示するのは良くない気がするので画像にしてノイズを散らして波型変形をかけてみました.
Mailmanのconfig_listコマンドで設定を出力してban_listをファイルに書き出し,Imagemagickのconvertコマンドでノイズと波型変形のフィルタをかけて画像を生成しました.
こんな感じの画像になります.これを申し込みページに説明と一緒に載せます.(ノイズのせいで容量が大きく……)

image

cronに登録しました.

$ sudo -u list crontab -l|grep ban_list
39 * * * *      /usr/lib/mailman/bin/config_list -c -o /dev/stdout users|grep ^ban_list |sed -e 's/^.*\[\|\]\|'\''\|'\ '//g'|sed -e 's/\@/ at /g'|tr -s ',' '\n' | sort -n > /var/lib/mailman/lists/users/ban_list && convert -size 1024x600 -background '#FFFFFF' -density 36 -gravity Center -fill black -font SetoFont label:"users ban_list `stat -c \%y /var/lib/mailman/lists/users/ban_list|cut -f1 -d.`\n\n`cat /var/lib/mailman/lists/users/ban_list`" -attenuate 5 -noise 7 +noise Gaussian -wave 15x`expr \( 100 + $((RANDOM \% 100)) \)` /var/lib/mailman/archives/public/users/ban_list.jpg

……長いですね.それに画像サイズ固定なのでlistが増えると文字サイズが小さくなってしまいます.てことでscriptに.

#!/bin/sh
 
LISTNAME='users'
FONT='SetoFont'
BANLIST='/var/lib/mailman/lists/users/ban_list'
IMAGE='/var/lib/mailman/archives/public/users/ban_list.jpg'
 
# ban_listを抽出してファイルに書き出し
/usr/lib/mailman/bin/config_list -c -o /dev/stdout ${LISTNAME} | grep ^ban_list | sed -e 's/^.*\[\|\]\|'\''\|''//g' | sed -e 's/\@/ at /g' | tr -s ',' '\n' | sort -n > ${BANLIST}
 
# ban_listの行数によって画像高さを計算
BANWC=`wc -l ${BANLIST} | cut -d -f1`
HIGHT=`expr \( ${BANWC} \* 60 + 120 \)`
 
# 画像に書き出す文字列を作成
LABEL="users ban_list `stat -c \%${BANLIST} | cut -f1 -d.`\n\n`cat ${BANLIST}`"
 
# 波型変形の波の深さを計算
WAVEX=`expr \( 10 + $((RANDOM % 10)) \)`
WAVEY=`expr \( 100 + $((RANDOM % 100)) \)`
 
# 画像作成
convert -size 1024x${HIGHT} -background '#FFFFFF' -density 36 -gravity Center -fill black -font ${FONT} label:"${LABEL}" -attenuate 5 -noise 7 +noise Gaussian -wave ${WAVWX}x${WAVEY} ${IMAGE}
 

てことでとりあえずの対処療法ですが…….

環境

$ lsb_release -d
Description:    Debian GNU/Linux 9.4 (stretch)
$ uname -m
x86_64
$ dpkg-query -W mailman
mailman 1:2.1.23-1+deb9u2
$ dpkg-query -W imagemagick
imagemagick     8:6.9.7.4+dfsg-11+deb9u4
]]>
https://matoken.org/blog/2018/07/12/mailmans-ban_list-as-image/feed/ 0