ページ 11

画像のパレットについて

Posted: 2015年7月30日(木) 00:16
by ぺんぎぬ
いつもこのHPを参考にプログラムを楽しませてもらっています。
以下の質問があり、初めて書き込みさせていただきました。

状況:
○Windows7 Visual Stdio 2008 C++ でDxlibを使用し、格闘ゲームの製作中
実現したいこと:
○キャラクターは3Dモデリングソフトで作成し、動作ファイルを数1000枚の256色bmpファイル(1024*1024)に連番出力する。その後この連番出力したbmpを「パレット付き」のpng(任意サイズ)に変換する補助プログラムを作成したい(2Pカラー作成のため)

困っていること:
Dxlibで実現できないかと思い、以下のようなtestを実施してみた。
このようにしてみたところ、色をある程度変えることはできるが
髪の色が黒いいろのキャラクターの髪の部分と黒い靴のいろが一緒に変わってしまう。

質問:
ある程度の色のグループごとにオリジナルのパレットを設定したいのですがどうすればいいでしょうか。
元の素材で塗り分けたい色の部分をはっきりと違う色にすることも考えたのですが、それは最終手段にしたいです。
問題は私がMakePAL8ColorSoftImageでパレット用の空画像を作って
BltSoftImageで何を実行しているか理解できなかったため、うまくできないのだと思います。。。
BltSoftImageでパレット画像にコピーした時にパレットの色分けが自動的に近い色でなされている感じですが、この色分けをある程度制御する方法があるか、知りたいです。
そのような便利な関数があるか、パレットの色域を変更する方法があるか、Dxlibでやるのはそもそも見当違いなのか、ご助言いただければ幸いです。

コード:

#include "DxLib.h"

//Dxlib初期化 中略

int w,h;//サイズ用
int handle1,handle2;//ハンドル用
int r,g,b;//各種色変数用
int pltnum;//パレット番号変数
 handle = LoadSoftImage( "test.bmp" ) ;// 画像の読み込み
 GetSoftImageSize( handle, &w, &h ) ;// 画像のサイズを取得
 handle2= MakePAL8ColorSoftImage(w,h);//パレット用空画像
 BltSoftImage(0,0,w,h,handle,0,0,handle2);//パレット用画像にコピー

//任意のパレット番号pltnum選択処理 中略

 GetPaletteSoftImage( handle2,pltnum, &r, &g, &b, 0 ) ;//任意パレットのRGBを取得

//任意のパレット内部の変えたい部分に数値をセット。例:gを240にする処理 中略
 
 SetPaletteSoftImage(handle2,pltnum,r,240,b,0);
//ここで色が変わるが、同じような色がまとめて変わってしまう。
//位置でも色でもいいが、ある程度色域を自分で決めたい

 SaveSoftImageToPng("testa.png",handle2,0);//出力処理

//終了処理、略

大変お手数おかけします。よろしくお願いいたします。

Re: 画像のパレットについて

Posted: 2015年7月31日(金) 01:20
by ぺんぎぬ
すみません。ちょっと考えてみて勘違いしていたことがありまして
恥ずかしながらBitmapはただRGBの並びだと思ってましたが、
256Bitmapは256パレットがあってそのパレット番号を参照しているんですね?
(パレット参照はPNGとかの圧縮形式のみと勝手に勘違いしてました。
またMakePAL8ColorSoftImageでパレット用画像作成とあったので、
さらに勘違いして、Bitmapをパレット化する関数と思いこんでしまったということかと;)

上記理解できたので自分でBitmapのパレット情報を読み込んで自分でBitmapにアクセスする関数を実装し色域の境界条件も自分で設定するのがよい気がしてきました。おそらくその際にSoftImage周りの関数に助けてもらうのでしょうが

まだ、MakePAL8ColorSoftImageの役割がよくわかっていません。
リファレンスには「この関数は他の二つの空イメージ作成関数とは違い、パレット画像を作成する関数となっています。」
となっていますが、この「パレット画像」とは何を指すのかを理解できません。
普通のBitmapとは違うのでしょうか。

Re: 画像のパレットについて

Posted: 2015年8月01日(土) 00:08
by ISLe()
パレット画像とは、ピクセル情報としてパレット番号が格納されている画像のことです。

MakePAL8ColorSoftImageのリファレンスに書かれていますが、デフォルトのパレットはRGBまんべんなく満たすようなパレットです。

BltSoftImageする前に、SetPaletteSoftImageでパレットカラーを変更しておけば、その後BltSoftImageした際には、ピクセルごとに最も近いカラーのパレット番号が選択されることでしょう。
あらかじめ暖色系でまとめておいて、あとから寒色系に切り替えるような場合、少ないパレットカラーを効率的に扱えます。


ただし、判別は色のみで行われるので、髪の毛の黒と靴の黒を区別するような仕組みは存在しません。


256色BMPファイルは既にパレット付きなのでPNGに変換してもパレットに関しては特に意味はないでしょう。
むしろPNGに変換する際にパレットが変化してしまうことに注意が必要になり手間が増えます。

パレットを固定化できる画像変換ツールを使うのがよろしいでしょう。

LoadSoftImageでパレット画像を読み込むとパレット画像のまま読み込まれるようなので、そもそもMakePAL8ColorSoftImageしてBltSoftImageする必要がないみたいです。

ぺんぎぬ さんが書きました:元の素材で塗り分けたい色の部分をはっきりと違う色にすることも考えたのですが、それは最終手段にしたいです。
個人的に常套手段だと思っているものを最終手段にしたいということなのでそうとうに難しい話ですね。