2022/06/16(木) [n年前の日記]
#1 [cg_tools] 減色処理プログラムのビルドができるか試してみた
減色ツールについてググって調べていた際に、以下のブログで減色処理をするプログラムのソースが公開されてることを知って興味が湧いた。これってビルドできないのだろうか。そのあたり、少し試してみた。
_高速版2色以上任意色数減色ソフト1 - ずるやすみねこのリサイズ研究
_高速版2色以上任意色数減色ソフト2 - ずるやすみねこのリサイズ研究
_高速版2色以上任意色数減色ソフト3 - ずるやすみねこのリサイズ研究
_高速版2色以上任意色数減色ソフト4 - ずるやすみねこのリサイズ研究
ちなみに、本来のプログラム名は bmp_color_reducer (bmp_color_reducer.exe) らしい。ヘルプ表示ではそのように記述されていた。
_高速版2色以上任意色数減色ソフト1 - ずるやすみねこのリサイズ研究
_高速版2色以上任意色数減色ソフト2 - ずるやすみねこのリサイズ研究
_高速版2色以上任意色数減色ソフト3 - ずるやすみねこのリサイズ研究
_高速版2色以上任意色数減色ソフト4 - ずるやすみねこのリサイズ研究
ちなみに、本来のプログラム名は bmp_color_reducer (bmp_color_reducer.exe) らしい。ヘルプ表示ではそのように記述されていた。
◎ ソースファイル群の入手。 :
ビルドに必要なファイルは、ソースファイル(.cpp)が3ファイル、ヘッダファイル(.h)が1ファイル。計4ファイルを、上記のブログからコピペして作成。
ちなみに、コメントが日本語文字列で書かれているので、文字コードは UTF-8N にして保存しておいたほうがヨサゲ。
- main.cpp
- mediancut.cpp
- mediancut_util.cpp
- mediancut_util.h
ちなみに、コメントが日本語文字列で書かれているので、文字コードは UTF-8N にして保存しておいたほうがヨサゲ。
◎ ビルド環境。 :
ビルドに使った環境は、Windows10 x64 21H2 + MSYS2 MinGW 64bit。
g++ と GNU Make が使える環境であること。
MSYS2 のインストールは、以下のページが参考になりそう。
_MSYS2/MinGW-w64 (64bit/32bit) インストール手順 メモ
_【msys2】インストール [新石器Wiki]
_MSYS2 MinGW GCC環境をつくる(その1)
g++ と GNU Make が使える環境であること。
$ g++ --version g++.exe (Rev2, Built by MSYS2 project) 12.1.0
$ make --version GNU Make 4.3 このプログラムは x86_64-pc-msys 用にビルドされました Copyright (C) 1988-2020 Free Software Foundation, Inc.
MSYS2 のインストールは、以下のページが参考になりそう。
_MSYS2/MinGW-w64 (64bit/32bit) インストール手順 メモ
_【msys2】インストール [新石器Wiki]
_MSYS2 MinGW GCC環境をつくる(その1)
◎ ビルドしてみる。 :
ビルドの手順としては、*.cpp をコンパイルして *.o を作って、その *.o 達をリンカで結合して実行バイナリを作るわけだけど…。
勉強も兼ねて、Makefile を書いてみた。Makefile の書き方は詳しくないので、無駄が多い記述になってるかもしれんけど…。
_Makefile.msys2
余談。Makefile内のインデントは、スペースじゃなくてTAB文字にしておくことに注意。
この Makefile.msys2 を、4つのソースファイルと同じ場所に置く。
Makefile.msys2 を Makefile にリネームすれば、単に make と打ち込むだけでビルドできる。
あるいは、使う Makefile を指定しても良い。
ちなみに、make clean と打てば、*.o や *.exe を削除するように Makefile 内で指定しておいた。
問題無くビルドができれば、bmp_color_reducer.exe という実行ファイルが生成される。
せっかくだから、ビルドした bmp_color_reducer.exe を zip に入れて置いときます。
_bmp_color_reducer.zip
MSYS2 をインストールしていないサブPC(Windows10 x64 21H2)上でも動いたから、他の環境でも動くのではないかな…。たぶん。
勉強も兼ねて、Makefile を書いてみた。Makefile の書き方は詳しくないので、無駄が多い記述になってるかもしれんけど…。
_Makefile.msys2
CXX = g++ CXXFLAGS = -O2 SRCS = main.cpp mediancut.cpp mediancut_util.cpp OBJS = $(SRCS:.cpp=.o) PROGRAM = bmp_color_reducer.exe all: $(PROGRAM) $(PROGRAM): $(OBJS) $(CXX) $(CXXFLAGS) -o $@ $(OBJS) -static -lstdc++ -lgcc -lwinpthread .cpp.o: $(CXX) $(CXXFLAGS) -c $< -o $@ mediancut.o: mediancut_util.h mediancut_util.o: mediancut_util.h .PHONY: clean clean: rm -f *.o rm -f $(PROGRAM)
余談。Makefile内のインデントは、スペースじゃなくてTAB文字にしておくことに注意。
この Makefile.msys2 を、4つのソースファイルと同じ場所に置く。
Makefile.msys2 を Makefile にリネームすれば、単に make と打ち込むだけでビルドできる。
make
あるいは、使う Makefile を指定しても良い。
make -f Makefile.msys2
ちなみに、make clean と打てば、*.o や *.exe を削除するように Makefile 内で指定しておいた。
問題無くビルドができれば、bmp_color_reducer.exe という実行ファイルが生成される。
せっかくだから、ビルドした bmp_color_reducer.exe を zip に入れて置いときます。
_bmp_color_reducer.zip
MSYS2 をインストールしていないサブPC(Windows10 x64 21H2)上でも動いたから、他の環境でも動くのではないかな…。たぶん。
◎ 使い方。 :
ソース配布先のブログでも説明されているけれど、以下のような指定で減色処理ができるらしい。
-irosuu N をつけると、使用する色数を指定できる。以下は、16色、32色を指定して減色する例。
ヘルプ表示は、-h。
その他のオプションは、元ブログの説明を参考に。
_高速版2色以上任意色数減色ソフト1 - ずるやすみねこのリサイズ研究
bmp_color_reducer.exe -i input.bmp -o output
- 入出力できる画像は、bmp画像のみ。試しに png画像を渡してもエラーを出して受け付けなかった。
- 入力ファイル名は、input.bmp のように、拡張子まで指定する。
- 出力ファイル名は、output のように、拡張子は省略する。自動で「.bmp」をつけてくれる。
- 入力ファイル名、出力ファイル名しか指定していない場合は、256色の画像に減色してくれる。
-irosuu N をつけると、使用する色数を指定できる。以下は、16色、32色を指定して減色する例。
bmp_color_reducer.exe -i input.bmp -o output -irosuu 16 bmp_color_reducer.exe -i input.bmp -o output -irosuu 32
ヘルプ表示は、-h。
bmp_color_reducer.exe -h
その他のオプションは、元ブログの説明を参考に。
_高速版2色以上任意色数減色ソフト1 - ずるやすみねこのリサイズ研究
◎ 余談。静的リンクについて。 :
当初、MSYS2上でビルドした bmp_color_reducer.exe をDOS窓上で実行したら、「DLLが無い」とエラーダイアログが表示されて動かなかった。
ググったら、以下が参考になった。
_msys2とC++で特定のDLLに依存しないwindowsバイナリを作る - siunのメモ
ldd というコマンドを使うと、その実行バイナリが何のDLLを要求するのか ―― 共有ライブラリの依存関係が分かるらしい。
どうやら、/mingw64 から始まる場所に置かれている .dll を見つけることができなくてエラーが表示されてしまった模様。それらの .dll を、.exe に静的リンクしてやれば解決するらしい。
前述の記事を参考にして、g++ に -static -lstdc++ -lgcc -lwinpthread を渡してビルドしたところ、以下のバイナリになった。
この状態なら、bmp_color_reducer.exe がDOS窓上でも動いてくれた。
ググったら、以下が参考になった。
_msys2とC++で特定のDLLに依存しないwindowsバイナリを作る - siunのメモ
ldd というコマンドを使うと、その実行バイナリが何のDLLを要求するのか ―― 共有ライブラリの依存関係が分かるらしい。
$ ldd bmp_color_reducer.exe ntdll.dll => /c/WINDOWS/SYSTEM32/ntdll.dll (0x7ffa18af0000) KERNEL32.DLL => /c/WINDOWS/System32/KERNEL32.DLL (0x7ffa18450000) KERNELBASE.dll => /c/WINDOWS/System32/KERNELBASE.dll (0x7ffa164e0000) msvcrt.dll => /c/WINDOWS/System32/msvcrt.dll (0x7ffa181a0000) libstdc++-6.dll => /mingw64/bin/libstdc++-6.dll (0x7ff9b7d10000) libgcc_s_seh-1.dll => /mingw64/bin/libgcc_s_seh-1.dll (0x7ff9fe9d0000) libwinpthread-1.dll => /mingw64/bin/libwinpthread-1.dll (0x7ff9fe920000) libwinpthread-1.dll => /mingw64/bin/libwinpthread-1.dll (0x2a5132b0000)
どうやら、/mingw64 から始まる場所に置かれている .dll を見つけることができなくてエラーが表示されてしまった模様。それらの .dll を、.exe に静的リンクしてやれば解決するらしい。
前述の記事を参考にして、g++ に -static -lstdc++ -lgcc -lwinpthread を渡してビルドしたところ、以下のバイナリになった。
$ ldd bmp_color_reducer.exe ntdll.dll => /c/WINDOWS/SYSTEM32/ntdll.dll (0x7ffa18af0000) KERNEL32.DLL => /c/WINDOWS/System32/KERNEL32.DLL (0x7ffa18450000) KERNELBASE.dll => /c/WINDOWS/System32/KERNELBASE.dll (0x7ffa164e0000) msvcrt.dll => /c/WINDOWS/System32/msvcrt.dll (0x7ffa181a0000)
この状態なら、bmp_color_reducer.exe がDOS窓上でも動いてくれた。
◎ Ubuntu Linux上でもビルドを試した。 :
せっかくだから、VMware Player + Ubuntu Linux 20.04 LTS上でもビルドできるか試してみた。
おそらくだけど、Ubuntu Linux の場合、build-essential というパッケージをインストールすれば g++ も make もインストールされるから、それだけでビルドできる状態になるのではないかと。たぶん。ちょっと自信無いけど。
_Ubuntu - focal の build-essential パッケージに関する詳細
_Ubuntu LinuxやDebianで使う、build-essentialってなんだ? - CLOVER
_build-essentialとは - Qiita
*NIX用の Makefile は以下。MSYS2版から、リンカに渡す指定を削って、生成ファイル名の .exe を削っただけ。
_Makefile.unix
Makefile.unix を Makefile にリネームすれば、make と打つだけでビルドできる。
あるいは、Makefile を指定しても良い。
make してみたら、いくつか警告は表示されてしまったものの、一応 bmp_color_reducer という実行バイナリが得られた。
実行は以下。
動作確認してみたところ、Windows用バイナリと同様に、減色処理ができているように見えた。
おそらくだけど、Ubuntu Linux の場合、build-essential というパッケージをインストールすれば g++ も make もインストールされるから、それだけでビルドできる状態になるのではないかと。たぶん。ちょっと自信無いけど。
sudo apt install build-essential
_Ubuntu - focal の build-essential パッケージに関する詳細
_Ubuntu LinuxやDebianで使う、build-essentialってなんだ? - CLOVER
_build-essentialとは - Qiita
*NIX用の Makefile は以下。MSYS2版から、リンカに渡す指定を削って、生成ファイル名の .exe を削っただけ。
_Makefile.unix
CXX = g++ CXXFLAGS = -O2 SRCS = main.cpp mediancut.cpp mediancut_util.cpp OBJS = $(SRCS:.cpp=.o) PROGRAM = bmp_color_reducer all: $(PROGRAM) $(PROGRAM): $(OBJS) $(CXX) $(CXXFLAGS) -o $@ $(OBJS) .cpp.o: $(CXX) $(CXXFLAGS) -c $< -o $@ mediancut.o: mediancut_util.h mediancut_util.o: mediancut_util.h .PHONY: clean clean: rm -f *.o rm -f $(PROGRAM)
Makefile.unix を Makefile にリネームすれば、make と打つだけでビルドできる。
make
あるいは、Makefile を指定しても良い。
make -f Makefile.unix
make してみたら、いくつか警告は表示されてしまったものの、一応 bmp_color_reducer という実行バイナリが得られた。
実行は以下。
./bmp_color_reducer -i input.bmp -o output
動作確認してみたところ、Windows用バイナリと同様に、減色処理ができているように見えた。
[ ツッコむ ]
#2 [xlib][xscreensaver] 雑魚敵の画像を作り直した
_先日、雑魚敵っぽい画像を作った
ものの、どうも見た目のボリュームが足りない感じがしてきたので、もうちょっと雑魚敵らしく見えそうな画像を作成し直してみた。
1フレーム64x64ドットを8枚並べた。22.5度ずつ回転するタイプ。CC0 / Public Domain ってことで。自由に使ってください。
アニメgif。
_enemy_type_d_01.gif
フルカラー画像。
_spritesheet_lanczos.png
32色に減色してドット修正したもの。
_spritesheet_32col.png
実験用のタイルマップ画像に合成したもの。
_scifi_bg_chip2.png
512x512ドットのレンダリング画像8枚 + .blendファイルをzipにしたもの。Blender 2.93.9 x64 LTS で作業。
_render512x512_and_blend.zip
1フレーム64x64ドットを8枚並べた。22.5度ずつ回転するタイプ。CC0 / Public Domain ってことで。自由に使ってください。
アニメgif。
フルカラー画像。
32色に減色してドット修正したもの。
実験用のタイルマップ画像に合成したもの。
512x512ドットのレンダリング画像8枚 + .blendファイルをzipにしたもの。Blender 2.93.9 x64 LTS で作業。
_render512x512_and_blend.zip
◎ xscreensaver上で表示してみた。 :
xscreensaver 上で実際に表示してみた。
動作確認環境は Ubuntu Linux 20.04 LTS。Windows10 x64 21H2 + VMware Player上で動かしてる状態。
_先日の見た目 よりは、それらしくなってくれた気がする。
ソース群や使用画像は以下。
_hellotilemap.c
_hellotilemap.man
_hellotilemap.xml
_scifi_bg_chip2_png.h
_scifi_bg_chip2.png
ファイルのコピー先や、ビルドの仕方は、以下でメモしてある。
_xscreensaverでタイルマップ描画
動作確認環境は Ubuntu Linux 20.04 LTS。Windows10 x64 21H2 + VMware Player上で動かしてる状態。
_先日の見た目 よりは、それらしくなってくれた気がする。
ソース群や使用画像は以下。
_hellotilemap.c
_hellotilemap.man
_hellotilemap.xml
_scifi_bg_chip2_png.h
_scifi_bg_chip2.png
ファイルのコピー先や、ビルドの仕方は、以下でメモしてある。
_xscreensaverでタイルマップ描画
◎ Xlib版も試した。 :
xscreensaver 版と似た感じの処理になるように、Xlib 描画版も修正して試してみた。まあ、見た目は xscreensaver版と同じなのだけど…。
ソースと使用画像は以下。
_10objs.c
_scifi_bg_chip2.xpm
ビルド手順や実行の仕方は、以下でメモしてある。
_Xlibでタイルマップの前に雑魚敵モドキを描画してみた
ソースと使用画像は以下。
_10objs.c
_scifi_bg_chip2.xpm
ビルド手順や実行の仕方は、以下でメモしてある。
_Xlibでタイルマップの前に雑魚敵モドキを描画してみた
gcc 10objs.c -o 10objs -I /usr/include/X11 -lX11 -lXext -lm -lXpm ./10objs
[ ツッコむ ]
以上、1 日分です。