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形式はわかるのですが、この箇所についてアドバイスをいただきたいです。
No.1ベストアンサー
- 回答日時:
getcは1byteのデータを読みますが、pbmは1byteで8ピクセルのデータを保持しています。
そのため横一列(幅xピクセル)の情報を取得するのに端数がでることが有ります。それを処理しています。
例えば幅100pixなら
100 = (8*12) + 4
の括弧で括った部分を先に処理しています。
が、必要なわけではないです。kのループ内で判定した方がすっきりします。
まぁコストはかかりそうですが、止めた方がいいと思います。
pbmは白黒しかありませんので各ピクセルのRGBの取りうる値は
(255,255,255)か(0,0,0)しかありません。
ですのでシフトで目的のビットの値を最下位ビットにして、その0or1で白黒を決めています。
でもなんだか反転してますね?
何でだろう……記憶違いかな?
面倒ですのでそこはご自分でお願いします(汗)
なるほど、いわれてみれば2値しか取りえないので1bitごとに1pxの情報を詰められるんですよね。肝心なことを忘れていました。。
8bit=1byteの8だったとは・・・
ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# カードシャッフルのブログラムを使ってc言語でブラックジャックをしたい 2 2022/04/12 15:13
- C言語・C++・C# C言語プログラム変更 2 2022/12/21 15:03
- Excel(エクセル) エクセルVBAでオブジェクトが必要です 2 2022/09/10 16:37
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# 質問です 下記のコードを分かりやすく解説お願いします 初心者です #include ‹stdio.h 3 2022/05/26 22:03
- Visual Basic(VBA) ExcelのVBAコードについて教えてください。 2 2023/05/23 16:28
- C言語・C++・C# LU分解法のピボッティングについて(C言語/gcc-9) 3 2022/07/11 23:10
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/06/02 15:27
- Excel(エクセル) エクセルのマクロについて教えてください。 1 2023/02/06 13:01
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
DoEvents関数って何?
-
SQLの速度をあげるには・・・
-
ノットイコールを教えて下さい
-
Excelでのセル内容の高速消去方法
-
プログラム上のCPU稼働率低減に...
-
Excel VBA データ削除の高速化
-
絶対パスの取得について
-
VC++2010 GDIオブジェクトの解...
-
基本情報技術者試験詳しい方へ...
-
Excel VBAにて、2GB超の点群デ...
-
win10で、正確な待ち時間の作り方
-
減色処理について
-
エクセルVBAで教えて頂きたいの...
-
Timerを使用しての強制待機
-
小数点を含む数値かどうか判断...
-
If Not c Is Nothing Then ~延...
-
C言語 再帰処理のメリットとデ...
-
C#で書かれたプログラムをバッ...
-
ヒストグラム平滑化について
-
Excel(VBA)でSetTimer関数を使...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Excelでのセル内容の高速消去方法
-
DoEvents関数って何?
-
win10で、正確な待ち時間の作り方
-
小数点を含む数値かどうか判断...
-
SQLの速度をあげるには・・・
-
絶対パスの取得について
-
Excel VBAにて、2GB超の点群デ...
-
VBでの簡易電卓の作成(減算方...
-
C言語:関数を使うメリットとデ...
-
テキストファイルの空行をスキ...
-
プログラム上のCPU稼働率低減に...
-
Excel(VBA)でSetTimer関数を使...
-
ナップザック問題?をエクセル...
-
If Not c Is Nothing Then ~延...
-
プログラム 擬似コードとはどん...
-
基本情報技術者試験詳しい方へ...
-
ノットイコールを教えて下さい
-
符号付きにすべきか、符号なし...
-
C言語 時刻差分の算出方法
-
実行時のCPU使用率を増やしたい
おすすめ情報