重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

電子書籍の厳選無料作品が豊富!

拡張子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++

A 回答 (7件)

No.6です。



すみません。結果は同じでした^^;

ただ、気になるのは
>・192のときはその値を1個データとして用いる
>・193(剰余が1)のときはその次の1バイトをそのバイトのデータとして用いる

ではなくて、

192「以上」なら64で割った余りが長さ、のときはその次の1バイトがデータ、
192「未満」なら、1個のデータそのもの

と解釈するのです。
    • good
    • 0

>それで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が 長さをあらわしています。
    • good
    • 0

No.2です。



試してみたところ、192以上であれば 64で割った余りを長さとして、その次の1バイトを長さ分だけコピーすればよいようです。

(192未満の場合、その値を1個データとして用います)

これできちんとラスタデータが得られます。
あとは末尾のパレットを用いて変換すればよいです。
    • good
    • 0
この回答へのお礼

迅速なご返答ありがとうございます.コーディングのお手数までおかけしてしまって申し訳ありません.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)


もう少し粘ってみます.どうもありがとうございました.

お礼日時:2005/04/07 02:11

#1補足>ピクセルが8ビットでプレーンが1なら


それは、256色のパレットを使用しているということです。
その時のパレットは、
ファイルの終端(EOF)から768バイト((R+G+B)×256)
また、圧縮については、#2でおっしゃっているとおりエンコードが1の時ランレングス圧縮されています。
パレットを使用している時のデータの並びは、
スキャンライン毎のパレットのアドレスの並びです。
    • good
    • 0
この回答へのお礼

下記に示したカラーパレットが画像の最後から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

お礼日時:2005/04/05 16:46

No.2です。



IF the top two bits of X are 1's

のところをどう訳すのか恥ずかしながら判りませんでしたので、適当なことを書いてしまいました・・・

どちらのbit「も」1ならば  ->192以上なら
どちらのbit「かが」1ならば ->64以上なら

と読み替えてください。
前者の方が効率的ですので前者のような気がします。
 
    • good
    • 0

ヘッダのEncodingのところが1ならばランレングス圧縮してあります。



デコード用のコードも上記サイトには書いてありますね。

つまりデータを1バイト見て、(Xとします)それが64以上ならば、それが長さを表す部分で、次の1バイトをその長さ分だけ同じデータで補填します。

長さは X%64 (Xの下位6bit)で得られます。と書いてあります。
(つまり63以上の長さは表現できない)

※間違っていたらごめんなさいね
    • good
    • 0
この回答へのお礼

わかりやすいご説明ありがとうございます.返答がおくれて申し訳ありません.
なるほど.ファイルの最後に256色のカラーマップが存在するのですか,Run Length Encoding(RLE)は,代表的な圧縮方法なのですね.
私が開きたいPCX画像も下記の参考サイトのような圧縮をされていると考えればいいのですよね?.
色データは256階調で,デコード用のコードも256階調なのかな?どうやって見分けをつけるのでしょうか?

ともかく今からコーディングします.256色のカラーマップだけでも確かめてきます.

参考サイト
http://www.ruche-home.net/program/bmp/rle.php
http://dictionary.rbbtoday.com/Details/term3007. …

もう少しねばってみます.またなにかお気づきの点がございましたらどんなささいなことでも結構ですのでよろしくお願いいたします.まずはお礼まで.

お礼日時:2005/04/05 15:43

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というサイズなんですが,カラーパレットだとか圧縮法などが存在するのでしょうか?

もう少しねばってみます.またなにかお気づきの点がございましたらどんなささいなことでも結構ですのでよろしくお願いいたします.まずはお礼まで.

補足日時:2005/04/04 07:54
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!