フルカラーのPNG形式の画像でカラーパレットを使えませんか?

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
FUNK
記事: 25
登録日時: 11年前

フルカラーのPNG形式の画像でカラーパレットを使えませんか?

#1

投稿記事 by FUNK » 11年前

よく複数のプレイヤーが同時にプレイ出きるゲームにて、
同じキャラクターを使用したときに、キャラクターの一部(服など)の色を変えるというものをよく見ます。

これを実装したいと思い、
ネット上で情報を集めてみたところ、
カラーパレットという技法を使用しているというのを知りました。

現在製作しているゲームでは、
フルカラーのPNG形式の画像を使用して、
1キャラクターあたりの画像枚数が1000近くもあるので、
新しく色を変えた画像を用意するのは現実的ではないと思っていたので、
カラーパレットを利用したいと思ったのですが、
調べていくとPNGでは256色までしか使えないというような情報がありました。

現在の画像を256色に減色したくはないけどカラーパレットを利用したいというのは、もしかしてワガママな願望かもしれませんが、
「実はいい方法があるよ」というのがありましたら、是非教えて頂きたいです。

もし良い方法が無いようでしたら諦めようと思いますので、
諦める為のお言葉も頂けたら有り難いです。

ちなみにDXライブラリを使用してます。
Boogaloo is funk feelin'.

アバター
h2so5
副管理人
記事: 2212
登録日時: 13年前
住所: 東京
連絡を取る:

Re: フルカラーのPNG形式の画像でカラーパレットを使えませんか?

#2

投稿記事 by h2so5 » 11年前

フルカラー画像の場合は色を変える部分と変えない部分の画像を別々にして描画するのが定石だと思います。
色を変える部分の画像に色相・彩度フィルタをかけてやれば簡単に色違いを作れます。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

Re: フルカラーのPNG形式の画像でカラーパレットを使えませんか?

#3

投稿記事 by softya(ソフト屋) » 11年前

現実的なのは、256色パレットです。
仮にフルカラーパレットというものが存在したとしたら、パレットだけで8bitx8bitx8bitx8bitx3=48MB消費します。
これが、png1つに1セットあるとしたら、1000枚の画像で約45GB必要なことになり現実的ではありません。
いくつか共通化するにしても、10種類で500MB近くを消費することになります。

h2so5 さんの方法か、256色減色ツールで共通パレット化するのが現実的だと思います。
「減色ツールの比較」
http://www.geocities.jp/subtractive_color/
よほど大きなキャラではない限り256色で十分という場合も多いです。

あとはオリジナルの可変インデックカラー画像フォーマットを自分で開発して実装するかですね。
※ 何万色もあるパレットだと狙った部位のカラーパレットだけ変えるってのも結構難しいじゃないかな。って思ったりもします。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

Ryo

Re: フルカラーのPNG形式の画像でカラーパレットを使えませんか?

#4

投稿記事 by Ryo » 11年前

中間色やアンチエイリアスされてない画像データなら
1ドットずつ色を調べて入れ替える
という方法が使えるかもしれません。
速度が要求に耐えられるかどうかは、わかりませんが

FUNK
記事: 25
登録日時: 11年前

Re: フルカラーのPNG形式の画像でカラーパレットを使えませんか?

#5

投稿記事 by FUNK » 11年前

掲示板に投稿する前に、色々なやり方で256以下に減色してみていたのですが、
やはり画像のクオリティが思っている以上に下がってしまいます。
ゲームのウリのひとつが画像のクオリティなので、
減色するくらいなら、色変更を諦めたいという思いです。

h2so5さんがご教授して下さったやり方が一番理想的なのですが、
画像数が多いので、ひとつひとつの画像の切り離し作業が途方も無い気がして、
すぐに取り掛かろうとはなかなかなれないです・・・。
(8キャラクターもいるので・・・)

他に良い方法が無いようであれば、
「色を変える」という方法以外でキャラクターの見分けをつけるというのも一案として考えてみようとも考えています。
格好悪いですが「キャラクターの頭上に「1P」「2P」というようなタグを表示する」とか・・・。

とにかく、色々とご教授して下さりありがとうございました。
今後の参考にしたいと思います。
Boogaloo is funk feelin'.

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

Re: フルカラーのPNG形式の画像でカラーパレットを使えませんか?

#6

投稿記事 by softya(ソフト屋) » 11年前

[分かりづらかったので修正]
普通は作るときに実験を済ませておく要素ですので、後手でできる事は少ないです。
例えば、最初から考えてないと出来ませんがペイントソフトのレーヤーで2P時に変える部分と変えない部分を分けておくんですよ。

現状は1000枚x8キャラだと、どう考えても機械的に色を変えるしか無いと思うので、バッチ処理が出来るグラフィックツールで一括して2Pキャラのグラフィックを作るぐらいしか手はないと思いますよ。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

ISLe
記事: 2650
登録日時: 13年前
連絡を取る:

Re: フルカラーのPNG形式の画像でカラーパレットを使えませんか?

#7

投稿記事 by ISLe » 11年前

PNGの仕様上は256色を超えるパレットを持つことは可能です。

8キャラクターというと格闘ゲームですかね。
アーケードゲームでも1スプライトあたり4096色を超えるハードはなかなかないような気がしますけど。

以下はパレット付きの画像データに変換できたとしての後の話ですが。

いまのPCでは描画時にパレットを変更できないので、画像を読み込むときに書き換えてパレット数分(同時プレイヤー数分)イメージを保持することになります。
メモリ上にそのまま画像データを読み込んで、パレットを書き換えてテクスチャに変換するという手をしばしば使います。
DXライブラリではCreateGraphFromMemとかCreateDivGraphFromMemなどの隠し関数を使うことで可能になります。

アバター
h2so5
副管理人
記事: 2212
登録日時: 13年前
住所: 東京
連絡を取る:

Re: フルカラーのPNG形式の画像でカラーパレットを使えませんか?

#8

投稿記事 by h2so5 » 11年前

ISLe さんが書きました:PNGの仕様上は256色を超えるパレットを持つことは可能です。
それはSuggested paletteのことでしょうか?
http://www.libpng.org/pub/png/spec/iso/ ... tml#11sPLT

仕様によるとSuggested paletteは減色するときに使用する色を指定するためのパレットなので、
色数は無制限ですがインデックスで指定する通常のパレットとは用途が異なります。
デコーダを自作すればどうにでもなりそうですが、結局のところ通常のパレットは256色しか指定できません。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

Re: フルカラーのPNG形式の画像でカラーパレットを使えませんか?

#9

投稿記事 by softya(ソフト屋) » 11年前

私はpngの仕様上は256色までだけど、フォーマット上はそれ以上にすることは可能と意味に受け取ったんでが違いますかね?
対応するソフトは無いと思うので自分で作るしか無いとは思いますけど。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

ISLe
記事: 2650
登録日時: 13年前
連絡を取る:

Re: フルカラーのPNG形式の画像でカラーパレットを使えませんか?

#10

投稿記事 by ISLe » 11年前

すみません、言葉足らずでした。

標準規格では、PNGはインデックスカラーに対して最大8ビット深度となっているので256色までしか扱えません。
仕様上はそれ以上の表現が可能なので、既存のライブラリに僅かな変更を加えるだけで利用できます。

アバター
h2so5
副管理人
記事: 2212
登録日時: 13年前
住所: 東京
連絡を取る:

Re: フルカラーのPNG形式の画像でカラーパレットを使えませんか?

#11

投稿記事 by h2so5 » 11年前

ISLe さんが書きました:標準規格では、PNGはインデックスカラーに対して最大8ビット深度となっているので256色までしか扱えません。
仕様上はそれ以上の表現が可能なので、既存のライブラリに僅かな変更を加えるだけで利用できます。
その場合は256色とは言わず256階調と言うのではないでしょうか。
チャンネルあたり8ビットの深度ならRGBで 256 * 256 * 256 = 16,777,216 色扱えることになります。

僕が256色と言っているのは、パレットに最大で256個しか登録できないため一つの画像の中で256通りの色しか使えないという意味です。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

Re: フルカラーのPNG形式の画像でカラーパレットを使えませんか?

#12

投稿記事 by softya(ソフト屋) » 11年前

パレットはチャンク構造なので256色以上登録できると思います。
それとグレイスケールの65536階調モードを組み合わせれば最大65536パターンのパレットが出来ると思うんですよ。
それがライブラリの改造で一番楽な方法かは分かりませんが。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
h2so5
副管理人
記事: 2212
登録日時: 13年前
住所: 東京
連絡を取る:

Re: フルカラーのPNG形式の画像でカラーパレットを使えませんか?

#13

投稿記事 by h2so5 » 11年前

http://www.libpng.org/pub/png/spec/iso/ ... tml#11PLTE
There shall not be more than one PLTE chunk.
パレットチャンクを複数使うのはPNGの仕様に反します。
独自のチャンクを追加すればもちろん可能ですけど、標準では256色しか登録できないことに変わりはありません。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

Re: フルカラーのPNG形式の画像でカラーパレットを使えませんか?

#14

投稿記事 by softya(ソフト屋) » 11年前

私はISLeさんの意見は最初から規格外のpngを作る前提だと思いますよ。
つまり、独自拡張したライブラリでしか扱わない前提に立っているものと思います。

>仕様上はそれ以上の表現が可能なので、既存のライブラリに僅かな変更を加えるだけで利用できます。

と書かれてますから。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
h2so5
副管理人
記事: 2212
登録日時: 13年前
住所: 東京
連絡を取る:

Re: フルカラーのPNG形式の画像でカラーパレットを使えませんか?

#15

投稿記事 by h2so5 » 11年前

規格外のPNGならそれはPNGではないわけですから、「PNGの仕様上~」という表現はおかしいのでは?
あと、独自拡張用に独自のチャンクをPNGに追加するのはPNGの規格外ではありません。しかし標準チャンクの仕様を無視するのは規格外です。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

Re: フルカラーのPNG形式の画像でカラーパレットを使えませんか?

#16

投稿記事 by softya(ソフト屋) » 11年前

h2so5 さんが書きました:規格外のPNGならそれはPNGではないわけですから、「PNGの仕様上~」という表現はおかしいのでは?
あと、独自拡張用に独自のチャンクをPNGに追加するのはPNGの規格外ではありません。しかし標準チャンクの仕様を無視するのは規格外です。
言葉のアヤだと思いますけど。 そこは追求しても意味は無いのでは?
ゲーム業界的には規格外でも動けば良いってフォーマットが多数作られてますから、そういうノリだと思ったんですが。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

Ryo

Re: フルカラーのPNG形式の画像でカラーパレットを使えませんか?

#17

投稿記事 by Ryo » 11年前

規格外かどうかは置いといて
「今ある1000×8のPngを、オリジナルフォーマットの画像に全部作り変える」
では、質問主の意図する物とは、かなりズレてしまうような気がします

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

Re: フルカラーのPNG形式の画像でカラーパレットを使えませんか?

#18

投稿記事 by softya(ソフト屋) » 11年前

ツールの形にすれば、png->オリジナルpngへの一括変換処理は出来ると思います。
問題は一括のパレットにまとめた時に何色のパレットになるかですね。 置き換えパレット作ること自体で色数が多すぎて作業不能かもしれません。
結構パレットの差し替えデータを作ることは難しいのです。
オフトピック
私が提案した案じゃないのに書いているが良いのだろうか?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

ISLe
記事: 2650
登録日時: 13年前
連絡を取る:

Re: フルカラーのPNG形式の画像でカラーパレットを使えませんか?

#19

投稿記事 by ISLe » 11年前

PNGの設計上は256色を超えるパレットを持つことは可能です。
と書けばよかったですかね。

規格/仕様で256エントリまでに制限されてはいますが、チャンクのサイズは32ビット値なので計算上は1431655765エントリまで可能です。

もちろんPLTEチャンクに256を超えるエントリを持たせたら(標準の)PNGではなく規格外ということになりますが。
でも仕様外とは言いませんね。
なぜなら仕様で不可能なことはそもそもできないことですから。
だとするとPLTEチャンクに256を超えるエントリを持たせることができるのは仕様と言って差し支えないのではないでしょうかね。
日本語の使い方間違ってます?
softya(ソフト屋) さんが書きました:あとはオリジナルの可変インデックカラー画像フォーマットを自分で開発して実装するかですね。
※ 何万色もあるパレットだと狙った部位のカラーパレットだけ変えるってのも結構難しいじゃないかな。って思ったりもします。
という発言もあったので、PNGを流用すれば楽できるという提案だったのですが。

閉鎖

“C言語何でも質問掲示板” へ戻る