質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

1回答

1891閲覧

PMG画像を圧縮するプログラムをRun length法を用いて作りたい

pinotr

総合スコア0

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2021/11/25 03:02

前提・実現したいこと

今、大学1年生でC言語を勉強しています。
わからないとこが出てきたので質問しました。

ここに質問の内容を詳しく書いてください。

PMG画像ファイルを圧縮するプログラムをRun length法を用いてつくりたいです。

int main(void){
...
getchar(); /* 1 文字目の ’P’ を読み捨てる /
getchar(); /
2 文字目の ’2’ を読み捨てる /
getchar(); /
3 文字目の ’\n’ を読み捨てる */

/* 以降で scanf を用いると,2 行目以降の数値を読み込める /
scanf("%d", ...); /
2 行目の数値(画像の横サイズ)を読み込む /
scanf("%d", ...); /
3 行目の数値(画像の縦サイズ)を読み込む */
... ✒

この続きと思われるPGM画像を圧縮するプログラムがわかりません。

※大学1年生でプログラミングが始まったばかりなので、forやifなどの基礎的なプログラムで教えていただけると嬉しいです。
※Run length法とは
255 255 255 255 255 100 100 100 100 63 63 63 63 63 63 63 63
という数値の列にRun length法を適用すると、
255 5 100 4 63 8
となるプログラム

※PMG画像ファイル
1 行目: 識別記号.「P2」という文字列と決められている.
2 行目: 画像の横サイズ(画素数)
3 行目: 画像の縦サイズ(画素数)
4 行目: 最大輝度(この画像における白色を表す値)
5 行目: 第 1 画素の輝度
6 行目: 第 2 画素の輝度
7 行目: 第 3 画素の輝度
‥‥

発生している問題・エラーメッセージ

エラーメッセージ

該当のソースコード

C言語

試したこと

ここに問題に対して試したことを記載してください。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

dodox86

2021/11/25 03:14

> この続きと思われるPGM画像を圧縮するプログラムがわかりません。 > ※大学1年生でプログラミングが始まったばかりなので、forやifなどの基礎的なプログラムで教えていただけると嬉しいです。 いやいや、それを考えて実装することこそが課題なのでしょうから、まず何よりご自分で考えてコードを書いてみましょうよ。現状ですと質問者さんのC言語のスキルも分からず、ほぼ丸投げです。 [質問するときのヒント] https://teratail.com/help/question-tips [推奨していない質問] https://teratail.com/help/avoid-asking
pinotr

2021/11/25 03:26

返信ありがとうございます。 自分でも考えて、Run length法のプログラムはかくことができたのですが、これをどのようにPMG画像圧縮に結びつけるのかがイメージすらできない状態です。 なにか例などで教えていただけたら幸いです。
dodox86

2021/11/25 03:30

マルチポストということですので、以降は回答、コメント共に辞退します。
fana

2021/11/25 04:43

× PMG 〇 PGM かな? で,PGMのフォーマット的にはランレングス圧縮した形の形式というのはなさそうに見えるけど,一体何をしたら結果になるんでしょうね? > 255 5 100 4 63 8 とかいう処理結果が得られとして,それをどうするの?っていう.
guest

回答1

0

  • どこぞから画像データを読み込む処理の実装については本件の主題ではない
  • [質問への追記・修正の依頼]にて問うているように,「圧縮処理結果をどうすればいいのか?」は不明である

ということで,
↓は,そこらへんについては,どうとでもできるように書いたつもりです.

C

1#define PIX_VAL_TYPE unsigned char 2 3typedef PIX_VAL_TYPE(*GetNextPixelValueFunc)( void * ); 4typedef void (*ResultReportDestinationFunc)( PIX_VAL_TYPE, unsigned int, void * ); 5 6void RunLengthProc( 7 unsigned int nTotalPixels, 8 GetNextPixelValueFunc GetPixVal, 9 void *LastArgValForGetPixel, 10 ResultReportDestinationFunc ReportResult, 11 void *LastArgValForReportResult 12) 13{ 14 PIX_VAL_TYPE PixVal; 15 unsigned int Length = 1; 16 if( nTotalPixels==0 )return; 17 PixVal = GetPixVal( LastArgValForGetPixel ); 18 for( unsigned int i=1; i<nTotalPixels; ++i ) 19 { 20 PIX_VAL_TYPE NewPixVal = GetPixVal( LastArgValForGetPixel ); 21 if( PixVal == NewPixVal ){ ++Length; } 22 else 23 { 24 ReportResult( PixVal, Length, LastArgValForReportResult ); 25 PixVal = NewPixVal; 26 Length = 1; 27 } 28 } 29 ReportResult( PixVal, Length, LastArgValForReportResult ); 30} 31 32//--------------------------------------- 33//以下は,↑を走らせてみるだけの,てきとーTestコード 34 35#define N_PIXELS (17) 36 37PIX_VAL_TYPE PixelValProvider( void *PixelValArray ) 38{ 39 static int index = 0; 40 return ( (const PIX_VAL_TYPE*)PixelValArray )[ index++ ]; 41} 42 43void ShowReportedResult( PIX_VAL_TYPE PixVal, unsigned int Length, void * ) 44{ printf( "%u %u\n", PixVal, Length ); } 45 46int main(void) 47{ 48 const PIX_VAL_TYPE PGM_PixelVals[N_PIXELS] = { 255, 255, 255, 255, 255, 100, 100, 100, 100, 63, 63, 63, 63, 63, 63, 63, 63 }; 49 RunLengthProc( N_PIXELS, PixelValProvider, (void*)PGM_PixelVals, ShowReportedResult, NULL ); 50 return 0; 51}

投稿2021/11/25 07:00

fana

総合スコア11996

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問