「さっと簡単に、10秒でレタッチできるアプリがあったらいいな」そんな思いで僕が作ったのが、画像にモザイクやテキストを素早く入れられるツール——「らくらくれたっち」です。
使い始めたときは、正直かなり気分がよかったんです。
画像を開いて、テキストを重ねて、保存。「おお、いい感じ!」と、自分でも満足していました。
最初は細めのゴシック体で文字を入れていたこともあり、多少のジャギー(ギザギザ感)はあっても「まあ、こんなものかな」「拡大して見てるから余計に気になるんだろうな」くらいに軽く流していたんですよね。
でも、気づいてしまった
あるとき、ちょっとインパクトを出そうと思って創英角ポップ体を選んでみたら、画面に表示された文字が、明らかにギザギザしてて汚い……。
さらに影や縁取りを付けてみたら、もう「これ本当に自分のアプリ?」ってレベルで違和感が。
せっかく目立たせようとしたはずの文字が、むしろノイズみたいに見えてしまう。
「これは“こんなもん”で済ませてはいけない」
ようやくそう思いました。
QPainterの限界にぶつかる
僕のアプリでは、文字やスタンプの描画にQtのQPainterを使っていました。
QPainterはGUI描画には便利で、高速に扱えるんですが、アンチエイリアス(境界の滑らかさ)にはやや難あり。
特に影や縁取りを重ねた時、ジャギーが一気に目立ってしまいます。
解決策はOpenCVだった
そこで思い切って、文字やスタンプの焼き付け処理をOpenCVに切り替えてみました。
🔧 やったこと(簡単な流れ)
QPainterで描いた影レイヤーをQImageに変換
np.frombuffer()
でNumPy配列化cv2.GaussianBlur()
でぼかし処理元画像と
cv2.addWeighted()
で合成
🧪 実際の処理(影ぼかし部分の抜粋)
# 影のピクセルをQImage → NumPyに変換
shadow_img = shadow_pix.toImage().convertToFormat(QImage.Format_ARGB32)
w, h = shadow_img.width(), shadow_img.height()
arr = np.frombuffer(shadow_img.bits(), dtype=np.uint8).reshape((h, w, 4))
# OpenCVで影をぼかす(ここがQPainterでは難しい)
ksize = max(1, blur_amount * 2 + 1)
blurred = cv2.GaussianBlur(arr, (ksize, ksize), 0)
# 再びQImageに戻して重ね描き
blurred_qimg = QImage(blurred.data, w, h, QImage.Format_ARGB32)
blurred_pix = QPixmap.fromImage(blurred_qimg)
painter.drawPixmap(0, 0, blurred_pix)
🔍 結果はどうだったか?
想像以上の効果でした。影はふんわり自然にぼけて、文字の輪郭も滑らか。
“手作り感”から“ツールらしいクオリティ”へと一気に進化しました。
以下は今回の改修前後の比較です。
同じ悩みを抱えている人へ
もしあなたも、影付きのテキストや縁取りで「なんか文字が汚いな…」「フォントを変えたら一気にダサくなった…」と感じたことがあるなら、ぜひQPainterだけで完結させずに、OpenCVで画像処理として焼き付ける設計を試してみてください。
描画の仕組みを少し変えるだけで、見た目のクオリティがぐっと上がります。