
拡張子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++
No.7ベストアンサー
- 回答日時:
No.6です。
すみません。結果は同じでした^^;
ただ、気になるのは
>・192のときはその値を1個データとして用いる
>・193(剰余が1)のときはその次の1バイトをそのバイトのデータとして用いる
ではなくて、
192「以上」なら64で割った余りが長さ、のときはその次の1バイトがデータ、
192「未満」なら、1個のデータそのもの
と解釈するのです。
No.6
- 回答日時:
>それで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が 長さをあらわしています。
No.5
- 回答日時:
No.2です。
試してみたところ、192以上であれば 64で割った余りを長さとして、その次の1バイトを長さ分だけコピーすればよいようです。
(192未満の場合、その値を1個データとして用います)
これできちんとラスタデータが得られます。
あとは末尾のパレットを用いて変換すればよいです。
迅速なご返答ありがとうございます.コーディングのお手数までおかけしてしまって申し訳ありません.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)
もう少し粘ってみます.どうもありがとうございました.
No.4
- 回答日時:
#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
No.3
- 回答日時:
No.2です。
IF the top two bits of X are 1's
のところをどう訳すのか恥ずかしながら判りませんでしたので、適当なことを書いてしまいました・・・
どちらのbit「も」1ならば ->192以上なら
どちらのbit「かが」1ならば ->64以上なら
と読み替えてください。
前者の方が効率的ですので前者のような気がします。
No.2
- 回答日時:
ヘッダの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. …
もう少しねばってみます.またなにかお気づきの点がございましたらどんなささいなことでも結構ですのでよろしくお願いいたします.まずはお礼まで.
No.1
- 回答日時:
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というサイズなんですが,カラーパレットだとか圧縮法などが存在するのでしょうか?
もう少しねばってみます.またなにかお気づきの点がございましたらどんなささいなことでも結構ですのでよろしくお願いいたします.まずはお礼まで.
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(ソフトウェア) ダウンロードしたファイルの「種類」が「Windowsmediaplayer」に変わってしまい、開くこ 2 2023/07/03 21:45
- その他(プログラミング・Web制作) Windowsのマクロプログラムで、こんなことできますか? 3 2022/06/28 14:30
- Excel(エクセル) 【マクロ】同じフォルダ内にある複数ブックから1つのブック内の1シートにデータを集めたい 6 2022/09/28 18:16
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/06/02 15:27
- Visual Basic(VBA) VBAが止まります。 2 2022/09/02 14:02
- その他(プログラミング・Web制作) python 気象データの取得 2 2023/06/20 23:54
- Excel(エクセル) エクセルでのアクセス履歴をとりたいです 1 2022/06/13 17:30
- Visual Basic(VBA) 動かなくなってしまった古いVBAを動くようにしたい 8 2022/09/20 13:57
- Java 動かなくなったのでJavaソースを手直しお願いします。 2 2022/04/30 05:35
- その他(プログラミング・Web制作) pythonでクラスで複数のメソッドを利用する方法 2 2022/04/15 04:17
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
バッファとは何ですか
-
Microsoft VBAで2GBを超えるフ...
-
バイナリのセーブデータを作るのに
-
HDDのバイナリイメージの取得方...
-
C言語でBMPファイルの内容を表...
-
JPGのwidhtとheight
-
コンピュータ系にはめっぽう弱...
-
BMP 仕様
-
読み込んだファイル
-
エクセルVBA 2千万行のCSVファ...
-
エディットボックスの改行について
-
この方法でバイナリデータが読...
-
バイナリ形式のXMLファイルを読...
-
RS-232Cで接続したPC間のファイ...
-
FTPでエクセルをPUTするとファ...
-
FMFファイルの構造を知りたいの...
-
ファイルの読み込み・書き込み
-
C言語初心者の質問失礼します。
-
どんなプログラムを書いても指...
-
VBScriptでのファイル結合処理...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
バッファとは何ですか
-
Microsoft VBAで2GBを超えるフ...
-
エラー:ストリームの終わりを...
-
EXCEL VBAでテキストファイルの...
-
エクセルVBA 2千万行のCSVファ...
-
EXCEL VBAで、バイナリデータの...
-
VBA バイナリ―から文字列にす...
-
ページ読み込み時に自動的にsub...
-
【python】Excelファイルを読み...
-
EOF
-
テキストデータをSQLServerに取...
-
PHPのfgetcsvの処理容量について
-
なぜデータの整合性を確認する...
-
【MFC】CFileでSeekした位置か...
-
C++ Builderにおける画像データ...
-
入力ファイルをバイナリにする利点
-
バイナリファイルの検索について
-
バイナリーデータの一部データ...
-
htmlのデータをwebページみたい...
-
Javaでのエンディアン変換
おすすめ情報