アプリ版:「スタンプのみでお礼する」機能のリリースについて

http://www.mm2d.net/c/c-09.shtml

を参考に、ppm形式の画像を読み込むプログラムの動作確認を行っています。
この参考URLにのっているソースの実際にRGB情報を取り込む処理で、raw形式の部分だけいまいちわかりません。
-----------引用-------------
case 4: /* 2値raw形式 */
for(i=0 ; i<y ; i++){
for(j=0 ; j<(x-1)/8 ; j++){
if((tmp = getc(fp)) == EOF){
deletePicture(pPic);
return NULL;
}
for(k = 7;k >= 0;k--){
*(r++) = *(g++) = *(b++) = (unsigned char)((1-((tmp>>k)%2))*255);
}
}
if((tmp = getc(fp)) == EOF){
deletePicture(pPic);
return NULL;
}
for(k=7 ; k>=7-(x-1)%8 ; k--){
*(r++) = *(g++) = *(b++) = (unsigned char)((1-((tmp>>k)%2))*255);
}
}
break;
-----------終わり-------------

とありますが、
for(j=0 ; j<(x-1)/8 ; j++){
...
としている理由(x-1を8で割ってる理由)および
for(k = 7;k >= 0;k--){
*(r++) = *(g++) = *(b++) = (unsigned char)((1-((tmp>>k)%2))*255);
}
としている理由がちょっとわかりません。(そもそもraw形式のファイル構造がいまいちつかめない)ascii形式はわかるのですが、この箇所についてアドバイスをいただきたいです。

A 回答 (1件)

getcは1byteのデータを読みますが、pbmは1byteで8ピクセルのデータを保持しています。


そのため横一列(幅xピクセル)の情報を取得するのに端数がでることが有ります。それを処理しています。
例えば幅100pixなら
100 = (8*12) + 4
の括弧で括った部分を先に処理しています。
が、必要なわけではないです。kのループ内で判定した方がすっきりします。
まぁコストはかかりそうですが、止めた方がいいと思います。


pbmは白黒しかありませんので各ピクセルのRGBの取りうる値は
(255,255,255)か(0,0,0)しかありません。
ですのでシフトで目的のビットの値を最下位ビットにして、その0or1で白黒を決めています。
でもなんだか反転してますね?
何でだろう……記憶違いかな?
面倒ですのでそこはご自分でお願いします(汗)
    • good
    • 0
この回答へのお礼

なるほど、いわれてみれば2値しか取りえないので1bitごとに1pxの情報を詰められるんですよね。肝心なことを忘れていました。。

8bit=1byteの8だったとは・・・

ありがとうございました。

お礼日時:2004/12/13 01:23

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