http://www1.axfc.net/uploader/Sc/so/74915.c
このppmからpgmにグレースケール化するプログラムをppmからppmのグレースケール化のプログラムに書き換えたのですができた画像を開こうとすると途中で処理が終わっているとエラーメッセージでてグレースケール化した画像が三枚並んでいる画像が出ます。修正箇所があれば教えてください。
ちなみに作ったプログラムは上のプログラムからPGMの部分を消してppmに書き換えています。
またグレースケール化の方法は 重み付けした輝度の計算で処理したいと思っています。こちらの修正もお願いします
(0.299 * R + 0.587 * G + 0.114 * B)
No.1ベストアンサー
- 回答日時:
実際に問題が起きているプログラムを提示していただけないと、
何が問題なのか、こちらには判断できません。
とりあえず、PGM出力をPPM出力するように変更する場合の一般論として、
・メモリは三倍確保していますか?
PGMは、width*height バイト、PPM は、width*height*3バイトです。
・メモリへの画素データの書き込みは正しくできていますか?
PGMでは、グレースケール値をimage[y*width+x]に1バイトだけ書き込むことになりますが、
PPMでは、RGB値の3バイトをimage[(y*width+x)*3+0]、image[(y*width+x)*3+1]、image[(y*width+x)*3+2]に書き込む必要があります。グレーケールなPPM画像なら同じ数値を3回。
・ファイルへの出力バイト数は間違えていませんか?
メモリ確保に同じ
・出力ヘッダの識別子は「P6」に変えていますか?
PGMは「P5」で、PPMは「P6」です。
> 重み付けした輝度の計算で処理したい
> (0.299 * R + 0.587 * G + 0.114 * B)
元のプログラムでは、「(R+G+B)/3」になってますから、それを上述の式に変えるだけです。
整数演算の「(299*R+587*G+114*B)/1000」にした方がちょっと速いかな。
この回答への補足
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#define BUFSIZE 1024
typedef struct tagPPM
{
int width;
int height;
int maxvalue;
unsigned char *image;
} PPM;
PPM *ppm_create(int width, int height)
{
PPM *ppm;
ppm = (PPM *)malloc(sizeof(PPM));
if (ppm != NULL)
{
ppm->width = width;
ppm->height = height;
ppm->maxvalue = 255;
ppm->image = (unsigned char *)malloc(width * height * 3);
if (ppm->image == NULL)
{
free(ppm);
ppm = NULL;
}
}
return ppm;
}
void ppm_destroy(PPM *ppm)
{
free(ppm->image);
free(ppm);
}
PPM *ppm_load(const char *fname)
{
FILE *fin;
char buf[BUFSIZE];
PPM *ppm;
int f = 0;
ppm = (PPM *)malloc(sizeof(PPM));
if (ppm != NULL)
{
fin = fopen(fname, "r");
if (fin != NULL)
{
buf[0] = 0;
fgets(buf, BUFSIZE, fin);
if (strcmp(buf, "P6\n") == 0)
{
do
{
fgets(buf, BUFSIZE, fin);
} while(buf[0] == '#');
sscanf(buf, "%d %d", &ppm->width, &ppm->height);
do
{
fgets(buf, BUFSIZE, fin);
} while(buf[0] == '#');
sscanf(buf, "%d", &ppm->maxvalue);
ppm->image = (unsigned char *) malloc(ppm->width * ppm->height * 3);
if (ppm->image != NULL)
{
fread(ppm->image, 3, ppm->width * ppm->height, fin);
f = 1;
}
}
fclose(fin);
}
if (f)
return ppm;
ppm_destroy(ppm);
}
return NULL;
}
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/06/02 15:27
- その他(プログラミング・Web制作) Python画像処理について 1 2022/05/17 17:40
- その他(プログラミング・Web制作) プログラムの勉強のおすすめは 7 2022/12/09 20:09
- PHP 掲示板を資料を参考にして開発中ですが、画像がアップされません? 1 2022/11/21 06:44
- Photoshop(フォトショップ) Photoshopの画像が重すぎるので軽くしたいです 7 2022/05/13 20:13
- Photoshop(フォトショップ) PhotoshopCSで、写真画像をグレーにした上で、5色(例えば虹色等)のグラデーションをかけたい 3 2023/03/18 12:10
- C言語・C++・C# 画像の画素値を変えるC言語のプログラムで指定された画像の中に白い三角形を右上に表示させるにはどのよう 3 2022/10/30 01:16
- Photoshop(フォトショップ) インデザイン 上で、フォトショップの線の色を変えたい 4 2022/06/12 18:49
- 画像編集・動画編集・音楽編集 ffmpegでppmからmp4を作成したい 1 2023/04/20 10:43
- Visual Basic(VBA) VBAが止まります。 2 2022/09/02 14:02
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VBAで仕様書は書きますか?
-
C言語(gcc), Linux, FTPプログ...
-
ノベルゲームを作成中なのですが、
-
例外処理があまり使われない理...
-
助けて欲しいです。どちらのハ...
-
VBAの初歩的な質問
-
空elseの有無
-
プログラムファイルの保存先
-
プログラミングのコード量に関...
-
C♯の勉強法おしえてください
-
プロのスキルについて
-
プログラムやシステムの設計構...
-
オブジェクト指向のプログラム??
-
GDLでH8/3052Fのi2cプログラム...
-
Win32 APIを使ったWindowsプロ...
-
COBOLのCALL文がいまいちつかめ...
-
プログラムの勉強の仕方
-
プログラムを間違えないように...
-
クラスやモジュールで纏める方...
-
APIの解説サイト
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBAで仕様書は書きますか?
-
GDLでH8/3052Fのi2cプログラム...
-
C言語(gcc), Linux, FTPプログ...
-
COBOLのCALL文がいまいちつかめ...
-
空elseの有無
-
きれいなコード vba vbaを勉強...
-
「ルーチン」という言葉の意味
-
プログラミングのコード量に関...
-
テキストの折り返し処理について
-
変数・オブジェクト名に漢字使用
-
クリップボードを排他的に利用...
-
メインプログラム、サブプログ...
-
例外処理があまり使われない理...
-
VBからシャットダウンさせる方法
-
クイズプログラムを作りたいの...
-
ソースコード改造 msペイント
-
他人が作ったプログラムのメン...
-
逆フーリエ変換のプログラムに...
-
プログラム動作時のCPU処理時間...
-
実行コマンドのプロセス管理
おすすめ情報