- ベストアンサー
pcxファイルを開きたい(RGBデータが正しく取得できない)
拡張子pcxの画像ファイルを開くプログラムを作っています.それでpcxファイルの最初についているヘッダファイルを開いて各種の情報はゲットできたのですが,そのあとのRGBデータが取得できません.取得できているとしてもどういうデータの並びなのかわからないのです. B,G,R,Iの順番なのか....R,G,B,Iなのか....いろいろためしてはいるのですがわからないのです. 私が取得したいpcxファイルは24bitとなっていましたからカラーパレットはないはずです.BMPファイルを開くのと同じようにやればできると思ったのですが. なお,私は英語が不得意で,誤訳しているのかもしれません. 参考サイト http://www.whisqu.se/per/docs/graphics57.htm 開発環境 Win2k,WinXP コンパイラ VC6.0++
- みんなの回答 (7)
- 専門家の回答
質問者が選んだベストアンサー
No.6です。 すみません。結果は同じでした^^; ただ、気になるのは >・192のときはその値を1個データとして用いる >・193(剰余が1)のときはその次の1バイトをそのバイトのデータとして用いる ではなくて、 192「以上」なら64で割った余りが長さ、のときはその次の1バイトがデータ、 192「未満」なら、1個のデータそのもの と解釈するのです。
その他の回答 (6)
- lachesis-r
- ベストアンサー率56% (28/50)
>それでRLEについてなのですが >・192のときはその値を1個データとして用いる >・193(剰余が1)のときはその次の1バイトをそのバイトのデータとして用いる >・今,192以上が複数並ぶ場合以下のようにデコードする >例1(105 195 165 176) >→(105 165 165 165 176) >例2 >(105 195 193 196 255 182) 例1(105 195 165 176)の場合、 105、165が3個(195を64で割った余りは3)、165、176とデコードします。 例2(105 195 193 196 255 182)の場合、 105、193が3個、255が4個、182 となるようにします。 2番目の195と4番目の196が 長さをあらわしています。
- lachesis-r
- ベストアンサー率56% (28/50)
No.2です。 試してみたところ、192以上であれば 64で割った余りを長さとして、その次の1バイトを長さ分だけコピーすればよいようです。 (192未満の場合、その値を1個データとして用います) これできちんとラスタデータが得られます。 あとは末尾のパレットを用いて変換すればよいです。
- BLUEPIXY
- ベストアンサー率50% (3003/5914)
#1補足>ピクセルが8ビットでプレーンが1なら それは、256色のパレットを使用しているということです。 その時のパレットは、 ファイルの終端(EOF)から768バイト((R+G+B)×256) また、圧縮については、#2でおっしゃっているとおりエンコードが1の時ランレングス圧縮されています。 パレットを使用している時のデータの並びは、 スキャンライン毎のパレットのアドレスの並びです。
お礼
下記に示したカラーパレットが画像の最後から256*3byteの範囲に存在すること確認しました.私はてっきりファイルのEOFは「ヘッダファイルのサイズ +Xmax × Ymax × 3」と思っていましたが,RLEを使っているためぜんぜん違うのですね. 丁寧なご説明をどうもありがとうございます.あとは,この画像でのRLEのデコードの仕方がまだよくわかっていないので,これについて英語の仕様書を見ていきます.あと1歩だからがんばります.またなにかございましたらどんなことでもけっこうですのでよろしくおねがいいたします. 0 0 0 128 0 0 0 128 0 128 128 0 0 0 128 128 0 128 0 128 128 192 192 192 192 220 192 166 202 240 ・ ・ ・ ・ 7 91 159 0 83 163 7 91 167 15 99 175 223 223 191 255 251 240 160 160 164 128 128 128 255 0 0 0 255 0 255 255 0 0 0 255 255 0 255 0 255 255 255 255 255
- lachesis-r
- ベストアンサー率56% (28/50)
No.2です。 IF the top two bits of X are 1's のところをどう訳すのか恥ずかしながら判りませんでしたので、適当なことを書いてしまいました・・・ どちらのbit「も」1ならば ->192以上なら どちらのbit「かが」1ならば ->64以上なら と読み替えてください。 前者の方が効率的ですので前者のような気がします。
- lachesis-r
- ベストアンサー率56% (28/50)
ヘッダのEncodingのところが1ならばランレングス圧縮してあります。 デコード用のコードも上記サイトには書いてありますね。 つまりデータを1バイト見て、(Xとします)それが64以上ならば、それが長さを表す部分で、次の1バイトをその長さ分だけ同じデータで補填します。 長さは X%64 (Xの下位6bit)で得られます。と書いてあります。 (つまり63以上の長さは表現できない) ※間違っていたらごめんなさいね
お礼
わかりやすいご説明ありがとうございます.返答がおくれて申し訳ありません. なるほど.ファイルの最後に256色のカラーマップが存在するのですか,Run Length Encoding(RLE)は,代表的な圧縮方法なのですね. 私が開きたいPCX画像も下記の参考サイトのような圧縮をされていると考えればいいのですよね?. 色データは256階調で,デコード用のコードも256階調なのかな?どうやって見分けをつけるのでしょうか? ともかく今からコーディングします.256色のカラーマップだけでも確かめてきます. 参考サイト http://www.ruche-home.net/program/bmp/rle.php http://dictionary.rbbtoday.com/Details/term3007.html もう少しねばってみます.またなにかお気づきの点がございましたらどんなささいなことでも結構ですのでよろしくお願いいたします.まずはお礼まで.
- BLUEPIXY
- ベストアンサー率50% (3003/5914)
24bitで、(ピクセルあたりのビット数8、プレーン数3になっている時) スキャンライン毎にカラープレイン順になっています。 line0:RRRRRRRRRRRRRRRR…GGGGGGGGGGGGGGGG…BBBBBBBBBBBBBBBB… line1:RRRRRRRRRRRRRRRR…GGGGGGGGGGGGGGGG…BBBBBBBBBBBBBBBB…
補足
迅速なご返答ありがとうございます. 私のブログにのっているコードを実行するとこんなかんじになります. Sample.pcxファイルの読み込み開始 現在のファイルポインタの位置 0 Manufacturer 10 Version 5 Encoding 1 BitsPerPixel 8 Xmin 0 Ymin 0 Xmax 1023 Ymax 599 biHDpi 1024 biVDpi 600 ↓カラーマップの中身を%d出力(48は文字型に直すと0になる) 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 現在のファイルポインタの位置 64 biReserved 0 biNPlanes 1 biBytesPerLine 1024 biPaletteInfo 0 biHscreenSize 0 biVscreenSize 0 現在のファイルポインタの位置 74 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 88 2 204 204 0 4 現在のファイルポインタの位置 128 BitsPerPixelが8で,biNPlanesが1,biPaletteInfoが0ですからパレットはないですね. ご指摘されたようなカラー平面順ではないのかな?カラー平面順に読み込んでみたりいろいろやっていますがやはりうまくいきません.なお,これだけ大きいファイル(1024*600)なのに345KBというサイズなんですが,カラーパレットだとか圧縮法などが存在するのでしょうか? もう少しねばってみます.またなにかお気づきの点がございましたらどんなささいなことでも結構ですのでよろしくお願いいたします.まずはお礼まで.
お礼
迅速なご返答ありがとうございます.コーディングのお手数までおかけしてしまって申し訳ありません.RLEについてまだまだよくわからないのですが,デコードした結果のbyte数が画像サイズと同じ614400byte(=1024*600pixel)になったのであともう少しだと思います. それでRLEについてなのですが ・192のときはその値を1個データとして用いる ・193(剰余が1)のときはその次の1バイトをそのバイトのデータとして用いる ・今,192以上が複数並ぶ場合以下のようにデコードする 例1(105 195 165 176) →(105 165 165 165 176) 例2 (105 195 193 196 255 182) →(105 193 193 193 255 255 255 255 182) もう少し粘ってみます.どうもありがとうございました.