mieki256's diary



2022/06/16(木) [n年前の日記]

#1 [cg_tools] 減色処理プログラムのビルドができるか試してみた

減色ツールについてググって調べていた際に、以下のブログで減色処理をするプログラムのソースが公開されてることを知って興味が湧いた。これってビルドできないのだろうか。そのあたり、少し試してみた。

_高速版2色以上任意色数減色ソフト1 - ずるやすみねこのリサイズ研究
_高速版2色以上任意色数減色ソフト2 - ずるやすみねこのリサイズ研究
_高速版2色以上任意色数減色ソフト3 - ずるやすみねこのリサイズ研究
_高速版2色以上任意色数減色ソフト4 - ずるやすみねこのリサイズ研究

ちなみに、本来のプログラム名は bmp_color_reducer (bmp_color_reducer.exe) らしい。ヘルプ表示ではそのように記述されていた。

ソースファイル群の入手。 :

ビルドに必要なファイルは、ソースファイル(.cpp)が3ファイル、ヘッダファイル(.h)が1ファイル。計4ファイルを、上記のブログからコピペして作成。
  • main.cpp
  • mediancut.cpp
  • mediancut_util.cpp
  • mediancut_util.h

ちなみに、コメントが日本語文字列で書かれているので、文字コードは UTF-8N にして保存しておいたほうがヨサゲ。

ビルド環境。 :

ビルドに使った環境は、Windows10 x64 21H2 + MSYS2 MinGW 64bit。

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
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)上でも動いたから、他の環境でも動くのではないかな…。たぶん。

使い方。 :

ソース配布先のブログでも説明されているけれど、以下のような指定で減色処理ができるらしい。

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を要求するのか ―― 共有ライブラリの依存関係が分かるらしい。

$ 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 もインストールされるから、それだけでビルドできる状態になるのではないかと。たぶん。ちょっと自信無いけど。
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
_enemy_type_d_01.gif


フルカラー画像。

spritesheet_lanczos.png
_spritesheet_lanczos.png


32色に減色してドット修正したもの。

spritesheet_32col.png
_spritesheet_32col.png


実験用のタイルマップ画像に合成したもの。

scifi_bg_chip2.png
_scifi_bg_chip2.png


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でタイルマップ描画

Xlib版も試した。 :

xscreensaver 版と似た感じの処理になるように、Xlib 描画版も修正して試してみた。まあ、見た目は xscreensaver版と同じなのだけど…。

ソースと使用画像は以下。

_10objs.c
_scifi_bg_chip2.xpm


ビルド手順や実行の仕方は、以下でメモしてある。

_Xlibでタイルマップの前に雑魚敵モドキを描画してみた
gcc 10objs.c -o 10objs -I /usr/include/X11 -lX11 -lXext -lm -lXpm
./10objs

以上、1 日分です。

過去ログ表示

Prev - 2022/06 -
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30

カテゴリで表示

検索機能は Namazu for hns で提供されています。(詳細指定/ヘルプ


注意: 現在使用の日記自動生成システムは Version 2.19.6 です。
公開されている日記自動生成システムは Version 2.19.5 です。

Powered by hns-2.19.6, HyperNikkiSystem Project