Python」タグアーカイブ

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 画像でした。

Python: open r+

Fedora 37 で今頃気がついたけど。
Anthy の辞書がまた PageDown でページ送りができなくなっているじゃん。

/usr/share/ibus-anthy/engine/engine.py は八月に更新されているな。
バッチは当ててくれなかったのか、気がつかなかったようで。
do_page_down なんてメソッドは定義されていないよメンテナさん。
しかたがない、今回も自前バッチを。

#!/usr/bin/env python3

'''
    Fedora 37 の Anthy で PageUp(Down) にて辞書送りできないのを修正
    コピペして sudo で実行しログインのやりなおし
    万が一失敗したら gnome-softwere から入れ直しで元通り
'''

import os

os.chdir('/usr/share/ibus-anthy/engine')

with open('engine.py') as f:
    src = f.read()
    dst = src.replace('do_page_up()', '__page_up(0)', 1).replace('do_page_down()', '__page_down(0)', 1)
    with open('engine.py', 'w') as g:
        g.write(dst)

今回は replace で。

いや Python の open には r+ という読み書きモードがあるんだけど?
と思うかもだけど r+ は使わないほうがいいよ。

#!/usr/bin/env python3

import os

with open('rw.txt', 'w') as f:
    f.write('ABCDEFG')

with open('rw.txt', 'r+') as f:
    src = f.read()
    #
    # 巻き戻すのを忘れずに
    f.seek(0)
    #
    # r+ での書き込みは以前の内容が残る
    dst = src.replace('ABCDE', 'a', 1)
    f.write(dst)
    #
    # 確認
    f.seek(0)
    print(f.read())
    #
    #=> 'aFGDEFG'

ね。
書き出しが短いと最初の語尾が残ってしまうんです。
文字数を合わせる、又はそれ以上なら問題ないんですけど。
ただ文字数を合わせても日本語だと以下のように。

#!/usr/bin/env python3

import os

with open('rw2.txt', 'w') as f:
    f.write('あいうえお')

with open('rw2.txt', 'r+') as f:
    src = f.read()
    f.seek(0)
    #
    # write は UTF-8 で書き出す
    dst = src.replace('あいう', 'aiu', 1)
    f.write(dst)
    #
    # 確認
    f.seek(0)
    print(f.read())
    #
    #=> 'aiuえおえお'

日本語はほぼ 3byte なので。
対策はあるんだろうけど、一番の対策は使わないことですよね。

ところで Nautilus 43 のリネームで入力メソッド切り替えが初回が無視される。
いやこれ US 配列キーボード愛用者以外には関係ないといえばそうなんですけど。
Ctrl+J のほうを使えばいいんだけど macOS と同じコッチを使ってしまうし。

Fedora とは関係ないけど GTK4 になった GHex もなんかおかしいな。

ghex font

Source Code Pro 以外のフォントだとはみ出すんだが。
なにがどうしてこうなるのか全然わからん。

Python typing

そういえば 10 月になった。
GNOME 43 はどうなったのかな?

GNOME Release Notes

シャットダウンが又してもアイコンのみに、コロコロ変わりすぎ。
ログアウト選択ダイアログの 2 アクションに戻るんだろうか?
macOS はずっと 1 アクションだし何年もメニューは変わっていないというのに。

gnome-terminal は新規ターミナルに置き換えみたい。
本サイトの Tips を書き換えしなきゃいけなくなりそうだ。

GTK4 化アプリは全部 Libadwaita デザインにするっぽいな。
GNOME に謎の魔改造をする某ディストロはどうすんのやら、しらんけど。

GNOME 43 for Developers

GtkInscription は解説を見てもよく解らないな。
Fedora 37 が出たら色々試してみよう。

役立たずだった GtkPicture に色々手を入れたみたい。
いや用途適にスマホの縦写真を回転してくれないと使い物にならんままですけど。

g_idle_add_once と g_timeout_add_once か、名前のとおりな関数。
FALSE を戻すだけでいいのにわざわざ別関数を作った意味は何だ?

Drag and Drop – GNOME Developer Documentation

もう筆者は知っているけど解説を作ったらしいので。
Python のコードを見るとアレッ、Python って型指定ができるの?

typing — 型ヒントのサポート ? Python 3.10.6 ドキュメント

-> は知っていたけどこういう指定も可能だったのか。
というか型指定は Python の型だけでなく Class ならなんでもいいのね。
Gio.File は PyGObject では Class 扱いです。

def on_drop(self, drop_target, value: Gdk.FileList, x, y, user_data=None):
    files: List[Gio.File] = value.get_files()

    # Loop through the files and print their names.
    for file in files:
        print(file.get_path())

たださ。
PyGObject は型指定しなくても動くし None 引数を省略できるんだが。

    drop_target = Gtk.DropTarget.new(Gdk.FileList, Gdk.DragAction.COPY)
    drop_target.connect('drop', self.on_file_drop)
    drop_target.connect('accept', self.on_drop_accept)
    self.add_controller(drop_target)

def on_drop_accept(self, target, drop):
    return True

def on_file_drop(self, target, value, x, y):
    self.set_uri(value.get_files()[0].get_uri())

筆者が書いたやつ。
型指定バリバリな解説は混乱を招くと思うんだけーが。

しかしこんなことで Python の知らなかった機能を知るとは。
Fedora 37 が出るまで Python Tips を書き足しでもするか。

rar

Fedora Tips を更新しました。
Fedora Tips – Paepoi

内容はあまり変わっていないけど表記が GNOME3 のままじゃなって。
ついでに公開鍵認証とかを追記して公開っと。

写真もいいけど他の古くなった Tips を書き換えや追記をしなきゃ。
ネタは一応色々あるんだけど。
たとえば現行 Fedora はデフォルトで RAR アーカイブを展開できるけど。

#!/usr/bin/env python3

import gi
gi.require_version('GnomeAutoar', '0.1')
from gi.repository import GnomeAutoar, Gio

RAR_FILE = '[もっとGF] 桃子の遠足!.cbr'

src = Gio.File.new_for_path(RAR_FILE)
outfile = Gio.File.new_for_path('output_dir')

ar = GnomeAutoar.Extractor(
    source_file=src,
    output_file=outfile)

ar.start(None)

できるのよ、cbr の拡張子のままでも。
でも圧縮が上手くいかないってオチがある。

gnome-autoar | Paepoi Blog

しかもコレ標準出力に投げることができない、ファイル化のみ。
我が Comipoli に使おうとかなと思ったけど無理っぽい。

そんな感じで色々中途半端で止まっている。
止まったまま Clutter 等が開発終了してしまったり筆者が忘れ去ったり。
覚書の細かいファイルばかりが溜まっていく、整理しなきゃ。