Mac」タグアーカイブ

AVIF

Web 用途の画像形式で近年は WebP が人気、筆者も blog で使っている。
文字列に弱い JPEG とサイズが大きめな PNG という欠点を補っています。
更に透過やアニメーションや可逆圧縮まで対応と至れり尽くせり。

でも広まらないと意味が無い、HEIF はもう死んでいる。
そういえば JPEG 2000 とかそんなのあったよなって、他は忘れた。
とはいえ既に結構広まっていますのでこのまま安泰かも。

ところで、似たようなフォーマットに avif という形式があるらしい。
特徴までそっくりで WebP より更にサイズが小さくなるらしい。

AVIFとは?特徴や注意点から変換できるアプリ・ツールまで紹介

AV1 動画と同じ圧縮を画像に展開したもののようです。
とりあえず上記からのリンク先にある avif ファイルで試す。

gnome

GNOME

macos

macOS

macOS スゲェ、すべて Preview.app で普通に表示できるし。
でも avif への変換はできない、これは WebP と同じ。
avif はオープンソースですし GNOME も対応は時間の問題かな。

hex

バイナリを見ると見事に ftypavif の mp4 コンテナですね。
そういえば HEIF もそうだし WebP も RIFF のコンテナだったね。
ということは。

mpv -autofit 400x300 photo.avif

mpv

mpv で普通に開くことができました、当然 WebP も同様に。
totem ではエラー、Quick Time はそもそも受け付けない。

次世代画像形式のWebP、そしてAVIFへ。変わり続ける技術に対応するweb制作の黄金解 – ICS MEDIA

こんなページも見つけた、JPEG XR なんて知らないぞ?
あぁ Windows 専用なのか、7 以降の Windows はマジで知らないし。
てか WebP って ffmpeg で変換できるのか、もしかして今なら。

ffmpeg -i gara.webp gara.avif

ffmpeg

おいおい、できるじゃないか。
これは新たな生き残りゲームが始まる予感。

でも写真は Exif の関係で今後も jpeg のままだろうし。
今は GIF や PNG を選んでいた所を WebP に置き換えが最適解かな。
知らんけど。

pdftocairo

PDF ファイルに一つの画像しか入っていないファイルが時々見つかる。
こういうファイルは使い辛いので画像に変換したくなりますよね。

Fedora 等の Linux であれば最初から入っている gs コマンドで変換できる。
以下のスクリプトをパスの通った場所に置いておくと便利みたいな。

#!/bin/sh

# pdf to jpeg
gs -dSAFRE -dBATCH -dNOPAUSE -sDEVICE=jpeg -sOutputFile=${@%.*}.jpg "$@"
# output 300dpi
#gs -dSAFRE -dBATCH -dNOPAUSE -sDEVICE=jpeg -r300 -sOutputFile=${@%.*}.jpg "$@"

これで今まで問題なかったんですけど。

路線・駅情報|電車のご利用案内|名古屋鉄道

ココの PDF ファイルで困ったことに。

gs jpeg

この手段では文字が潰れて読めません、JPEG の弱点がモロに。
300dpi に指定すれば読めるけどファイルが巨大に、一億画素って。。。
ならば PNG にすればいいかなと。

gs -h

を見ると png256 や pngalpha があるなと。
png256 指定だと jpeg 同様に潰れる、てかアンチエイリアスが死ぬ。
pngalpha を指定してみる、嫌な予感がするけど。

#!/bin/sh

gs -dSAFRE -dBATCH -dNOPAUSE -sDEVICE=pngalpha -sOutputFile=${@%.*}.png "$@"

gs png

やっぱり、PDF の白背景って実は透過なのよ。
印刷用途を考えると利にかなっているけど GUI ではこうなるんです。
自作アプリを PDF に対応させた時ソコに苦労したもん。

じゃあ、ということで Poppler を使って自作してみたんですが。
今度は異様に小さくなってしまった、dpi を得るとかしなきゃ駄目なのか?
上手くいかなかったのでコードは貼らないけど。

なんか他に上手い手段は無いかと色々探す。
いやまて、もしかしたらオイラは凄い遠回りをしているんじゃないか?
思いつきでターミナルにて pdf と打って Tab キーを叩いてみる。

pdftocairo

pdftocairo なんてコマンドがあるんだが。
Poppler の付属品のようなので GNOME なら最初から入っているはず。
help を見てみるとこの用途ズバリみたいな、よし試す。
ppi はデフォルトが 150 だけど 72 で十分かな。

pdftocairo -png -r 72 rosenzu.pdf out

出力名指定は拡張子不要、自動連番で複数ページにも対応みたい。
更に以前書いたスクリプトで WebP に変換すると小さくなって素敵。

to webp

うん完璧だ、今度からこのコマンドを使おう。
指定が単純だから Nautilus スクリプト化やラッパーコマンドも不要ですね。
と Fedora ではここまで調べるのに時間が掛かりましたけれど。

preview.app

macOS なら Preview.app から複製して保存するだけで変換できます。
dpi 指定も GUI で可能とか、やっぱり画像関連では macOS のほうが便利です。

macOS: Get UTI (Ventura)

macOS 13 Ventura で以下の関数が使えなくなった件。

# Deprecated
UTTypeCreatePreferredIdentifierForTag

UTI を調べる方法にて検索するとメッチャ見つかります。
でももう使えません、別の方法を探す。

UTType | Apple Developer Documentation

UTType クラスに typeWithFilenameExtension メソッドがある。
+ だから static method ですね、これ使えるかも。
以下 PyObjC です、他言語の人は変換してね。

#!/usr/bin/env python3

'''
    PyObjC @ Get UTI
'''

import sys, UniformTypeIdentifiers

for filename in sys.argv[1:]:
    n = filename.rfind('.') + 1
    if n > 0:
        ext = filename[n:]
        uti = UniformTypeIdentifiers.UTType.typeWithFilenameExtension_(ext)
        print(f'{ext}: {uti}')


''' Deprecated

import sys, CoreServices

for ext in sys.argv[1:]:
    uti = CoreServices.UTTypeCreatePreferredIdentifierForTag(
        CoreServices.kUTTagClassFilenameExtension, ext, None)
    arr = CoreServices.UTTypeCopyDeclaration(uti)['UTTypeConformsTo']
    con = ','.join(arr)
    print(f'{ext}: {uti} [{con}]')
'''

# ex: ft=py

get uti

よしデジカメ RAW ファイルでも問題なく UTI が得られるぞと。
本サイトのほうも書き換えしておきます。
しかし以前貼ったスクリプトで WebP 化したけど文字がチト見づらいな。
これも要改良かな、ということで。

aoji

今日はアオジが撮れました。

Change 72dpi Screenshot

前回画像を PIL で WebP 化するネタを書いたけど。
どうせならスクリーンショットの 72dpi 化も同時にやりたい。
72dpi にして WebP にして、って二度手間じゃん。

色々試すとそのまま Image.save は全部 72dpi になるらしい。
ということは半分にリサイズしてセーブするだけですね。

import sys, os, re
from PIL import Image

arg = sys.argv[1:]
for s in arg:
    if re.search(r'\.(jpe?g|png|gif)$', s, re.I):
        im = Image.open(s)
        # 144dip to 72dpi
        x, y = im.size
        im_s = im.resize((x//2, y//2), Image.Resampling.LANCZOS)
        im_s.save(f'{os.path.splitext(s)[0]}.webp')

検索でよく見つかる Image.ANTIALIAS は非推奨になっているので注意。
これを前回と同様に Automator でメニューに追加。

mm

ところで前回 .zprofile をフルパスでって書いたけど。
チルダでイケた、ユーザーは自分自身だもんね。

ss

Pillow って思っていたより高機能なんですね、もっと色々やってみよう。
Pillow (PIL Fork) 9.4.0 documentation

WebP conversion @ Automator

[CGImageDestinationCreateWithURL webp] で検索。
以下は一年前に書かれたものだけど。

ios – “unsupported file format ‘org.webmproject.webp'” while saving CGImage in webp format – Stack Overflow

#!/usr/bin/env python3

from Quartz import *

src_type = CGImageSourceCopyTypeIdentifiers()
CFShow(src_type)
dest_type = CGImageDestinationCopyTypeIdentifiers()
CFShow(dest_type)

macOS 13 Ventura でも非サポートなんですね。
どうやら OS 頼りは現状無理っぽい。

しかたがない、Python や PHP を使う。
WebP を使うような人ならどちらかは入れているはず。
これでコマンドを作って Automator で呼び出しする方法を。

PHP: imagecreatefromjpeg – Manual

ココでは Python3 を使う、PHP でやる人は上記サンプルコードを参考に。
Python3 では Pillow(PIL) が必要、残念ながら HEIF は未対応。

pip install Pillow

いつのまにか pip3 でなく pip でイケるようになってる。
python3 も 3 を打たなくていいようにしてよ、Fedora みたく。
そしてコマンドを書く。

#!/usr/bin/env python3

import sys, os, re
from PIL import Image

arg = sys.argv[1:]
for s in arg:
    if re.search(r'\.(jpe?g|png|gif)$', s, re.I):
        im = Image.open(s).convert('RGB')
        im.save(f'{os.path.splitext(s)[0]}.webp', 'webp')

を拡張子無し実行パーミッション有りでパスの通った場所に置く。
名前は img2webp とか解りやすい名前にしておく。

Automator で新規書類、クイックアクションを選択。
「指定されたFinder項目を取得」のアクションをドラッグで配置。
「シェルスクリプトを実行」を同様に配置。
ワークフローが受け取る現在の項目を「イメージファイル」に。
入力の引渡し方法を「引数として」に。
そしてシェルスクリプトに自作コマンドを呼び出すコードを。

# Automator は読み込まないのでフルパスをドットコマンド
# もちろん source コマンドでもいい
. /Users/sasakima-nao/.zprofile
. /Users/sasakima-nao/.zshrc
# 自分が付けたコマンド名にしてね
img2webp "$@"

automator

いや、~/.zshrc とかに何も登録していないなら読み込まなくていいけど。
Python 3.10 は ~/.zprofile に書き込みしているから呼び出せるのであって。
コレをしないと場合によっては古いバージョンを呼び出しとかしてしまう。
読み込まない又はパスを通していない場合は自作コマンドもフルパスにしてね。
とにかくコレを create_webp とか解りやすい名前で保存。

menu

困ったことにデジカメの RAW 画像でも出ちゃうんだなこれが。
なので拡張子で振り分けする処理は必須です、おしまい。
このスクリーンショットはコレで変換した WebP 画像でした。