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

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

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

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

Q&A

解決済

1回答

4781閲覧

PGM形式の画像の圧縮がわかりません。

Riiiiiiiituw

総合スコア8

C

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

0グッド

0クリップ

投稿2018/11/22 03:02

編集2018/11/22 03:40

pgm形式の画像をscanfで読み取ってランレングス法で圧縮し、圧縮したデータを出力して元の画像にもどすプログラムを造るんですが全く解りません。初めに圧縮するファイルにgetcharでP2 を読み捨てて、scanfで2行目以降の数値を読み込むプログラムを作るを作らないといけないそうなのですが、いまいちよくわかりません。
また、変数設定についても教えていただけるとありがたいです。
ちなみにヘッダは
include<stdio.h>
int main(void)

です。

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

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

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

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

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

poniponiponiki

2018/11/22 03:07

勉強大変かと思われますが、これだけでは何が分からないのかが分からないのでもう少し詳細に問題点を挙げていただけますでしょうか?
Zuishin

2018/11/22 03:19

タグが C# になっているので C に直してください。でないと C の得意な人が素通りします。また、コードブロックを使ってください。御覧のようにソースがその通り書かれていません。それと、問題は RunLength ではなく C 言語入門レベルの知識なので、質問が不適当です。
Zuishin

2018/11/22 03:25 編集

コードブロックを使ってください。御覧のようにソースがその通り書かれていません。それと、問題は RunLength ではなく C 言語入門レベルの知識なので、質問が不適当です。getchar と scanf の使用法を尋ねるよう、タイトルと内容を変更してください。
poniponiponiki

2018/11/22 03:24

pgmファイルをscanfで読み取ってRunLngth法で圧縮し、圧縮したデータを出力して元の画像にもどすプログラムを作成する、ということですか?
Riiiiiiiituw

2018/11/22 03:26

はい、その認識で大丈夫です。
Zuishin

2018/11/22 03:27

コードブロックを使ってください。御覧のようにソースがその通り書かれていません。それと、問題は RunLength ではなく C 言語入門レベルの知識なので、質問が不適当です。getchar と scanf の使用法を尋ねるよう、タイトルと内容を変更してください。
Zuishin

2018/11/22 03:29

ちょっと要求が高度すぎましたか?
poniponiponiki

2018/11/22 03:32

では、そのように質問文を修正していただけますか?他の方もわかるように
guest

回答1

0

ベストアンサー

以下の手順になるかと思います。

  1. pgm フォーマット を解析する。
  2. データを run length 方式で圧縮する。
  3. 圧縮したデータを解凍する。

サンプルとして、こちらの pgm ファイル を使用しました。

cpp

1#include <fstream> 2#include <iostream> 3#include <iterator> 4#include <string> 5#include <vector> 6 7/** 8 @brief 圧縮する。 9 @param src 圧縮前のデータ 10 @param dst 圧縮後のデータ 11 */ 12void compress(const std::vector<int> &src, std::vector<int> &dst) 13{ 14 for (int i = 0; i < src.size(); ++i) { 15 int count = 1; 16 // 同じ値が続く限り進める。 17 while (i < src.size() - 1 && src[i] == src[i + 1]) { 18 ++count; 19 ++i; 20 } 21 22 dst.push_back(src[i]); // 値 23 dst.push_back(count); // 連続する個数 24 } 25} 26 27/** 28 @brief 解凍する。 29 @param src 解凍前のデータ 30 @param dst 解凍後のデータ 31 */ 32void uncompress(const std::vector<int> &src, std::vector<int> &dst) 33{ 34 for (int i = 0; i < src.size(); i += 2) { 35 int val = src[i]; 36 int count = src[i + 1]; 37 38 for (int j = 0; j < count; ++j) 39 dst.push_back(val); 40 } 41} 42 43int main() 44{ 45 std::string imgPath = R"(sample.pgm)"; 46 47 // ファイルを解析する。 48 // 参考: https://people.sc.fsu.edu/~jburkardt/data/pgma/pgma.html 49 std::string version; 50 int width, height, maxValue; 51 52 std::ifstream ifs(imgPath); 53 // ヘッダー 54 ifs >> version >> width >> height >> maxValue; 55 // 画素値 56 std::vector<int> data( 57 std::istream_iterator<int>{ifs}, std::istream_iterator<int>()); 58 59 std::cout << "version: " << version << std::endl; 60 std::cout << "size: " << width << "x" << height << std::endl; 61 std::cout << "max value: " << maxValue << std::endl; 62 63 // run length 圧縮 64 std::vector<int> compressed; 65 compress(data, compressed); 66 std::cout << "row size: " << data.size() << std::endl; 67 std::cout << "compressed size: " << compressed.size() << std::endl; 68 69 // 解凍する。 70 std::vector<int> uncompressed; 71 uncompress(compressed, uncompressed); 72 73 // 圧縮前とデータが一致するか 74 bool allEqual = true; 75 for (int i = 0; i < data.size(); ++i) 76 allEqual &= data[i] == uncompressed[i]; 77 std::cout << "all equal: " << allEqual << std::endl; 78 79 ifs.close(); 80} 81

出力結果

version: P2 size: 600x600 max value: 255 row size: 360000 compressed size: 51782 all equal: 1

投稿2018/11/22 04:42

tiitoi

総合スコア21956

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問