5ちゃんねる ★スマホ版★ ■掲示板に戻る■ 全部 1- 最新50  

■ このスレッドは過去ログ倉庫に格納されています

画像データをAAに変換するプログラム

1 :デフォルトの名無しさん:2010/08/23(月) 19:13:24
組んでみたいんですが、一応変換はできるものの全く
画像データをうまく表現できません(;´Д`)

どう改善すれば細かいAAアートが出力できるのでしょうか?
あとメモ帳などに出力したいんですがどうすればいいでしょうか?

初心者なのもので基本的な質問すいません・・
ちなみにC言語です。


2 :デフォルトの名無しさん:2010/08/23(月) 19:15:05
/* カラー画像をモザイク化、AA化するプログラムcmosaic.c
コンパイルの仕方:gcc -o cmosaic cmosaic.c */
#include <stdio.h>
#include <stdlib.h>
#include "ppmpgm.h"


/*----------------------------------------------------------------------
関数名:make_cmosaic_image
機能: カラー画像の白黒モザイク化からAAへ
入力: pimage1, pXdim1, pYdim1
出力: pimage2, pXdim2, pYdim2
----------------------------------------------------------------------*/
void make_cmosaic_image()
{
int i,j,x,y,k; /* 制御変数 */
int bsz; /* ブロックサイズ */
int bx,by; /* 横方向と縦方向ブロック数 */
int bvalR,bvalG,bvalB; /* ブロックの平均値 */
int pels; /* ブロック内ピクセル数 */
int X,Y;
int MON; /* ピクセルの位置 */
//char AC[15];

// AC[15] = {'H','D','E','J','L','I','c','(','ワ','*','+',':','-','.',' '};

char AC[15] = {"HDEJLIc(ワ*+:-. "};
char AAimage[256][300];


printf("カラー画像のモザイク化\n");

3 :デフォルトの名無しさん:2010/08/23(月) 19:17:17
pXdim2 = pXdim1; /* 横画素数 */
pYdim2 = pYdim1; /* 縦画素数 */

printf("ブロックサイズを入力してください(1より大きい値):");
scanf("%d",&bsz);
printf("ブロックサイズは%dである。",bsz);
printf("\n");

if(pXdim1 % bsz == 0) /* 横方向ブロック数 */
bx = pXdim1 / bsz;/* %演算子と/演算子は何にか違うか? */
else
bx = pXdim1 / bsz + 1;

if(pYdim1 % bsz == 0) /* 縦方向ブロック数 */
by = pYdim1 / bsz;
else
by = pYdim1 / bsz + 1;

/* モザイク化する */
for(j=0; j<by; j++){
for(i=0; i<bx; i++){ /* ブロックごとに計算する*/
/* 各ブロックのピクセル平均値を計算する*/
bvalR = bvalG = bvalB = 0;
pels = 0;

/* 各ブロック内ピクセル値の和を計算する */
for(y=0; y<bsz; y++){
for(x=0;x<bsz; x++){
/* 現在のピクセルの位置を計算する */
X = i*bsz + x;
Y = j*bsz + y;

4 :デフォルトの名無しさん:2010/08/23(月) 19:20:30
/* この位置が有効であれば、和を計算する */
if(X>=0 && X<pXdim1 && Y>=0 && Y<pYdim1){
/* 有効なので、ブロック内のピクセル数をカウントする */
pels++;

/* 和を計算する */
bvalR += pimage1[0][Y][X];
bvalG += pimage1[1][Y][X];
bvalB += pimage1[2][Y][X];
}
}
}

/* ブロック内ピクセルの平均値を計算する */
bvalR /= pels;
bvalG /= pels;
bvalB /= pels;

MON=0.299*bvalR+0.587*bvalG+0.114*bvalB;

/* 計算した平均値を目的画像へ代入する */
for(y=0; y<bsz; y++){
for(x=0; x<bsz; x++){
X = i*bsz + x;
Y = j*bsz + y;
if(X>=0 && X<pXdim1 && Y>=0 && Y<pYdim1){
pimage2[0][Y][X] = MON;
pimage2[1][Y][X] = MON;
pimage2[2][Y][X] = MON;




5 :デフォルトの名無しさん:2010/08/23(月) 19:22:02
}
}
}
MON = MON / 17;
if(MON < 0 ) MON = 0;
if(MON > 14 ) MON = 14;

AAimage[y][x] = AC [MON];
printf("%c", AAimage[y][x]);

}

printf("\n");


}
}
main()
{
load_image_ppm(); /* 画像データをpimage1に読み込み */
make_cmosaic_image(); /* pimage1 画像を pimage2 へ */
save_image_ppm(); /* pimage2 を保存する */
return 0;
}


6 :デフォルトの名無しさん:2010/08/23(月) 19:29:28
このスレッドは天才チンパンジー「アイちゃん」が
言語訓練のために立てたものです。

アイと研究員とのやり取りに利用するスレッドなので、
関係者以外は書きこまないで下さい。

                  京都大学霊長類研究所


7 :デフォルトの名無しさん:2010/08/24(火) 00:11:30
なんで車輪の再発明したがるんでしょうね

8 :デフォルトの名無しさん:2010/08/24(火) 00:16:22
練習じゃね

9 :デフォルトの名無しさん:2010/08/25(水) 00:13:36
C/C++よりC#、Javaの方が簡単にできたりする

10 :デフォルトの名無しさん:2010/08/25(水) 00:31:24
>>1
「メモ帳などに出力」の意味が判らんが、テキストファイルに落としたいだけなら
コマンドラインで./cmosaic > foo.txt でよかろ。

11 :デフォルトの名無しさん:2010/08/25(水) 13:41:29
aalib, libcaca

12 :デフォルトの名無しさん:2010/08/25(水) 22:28:09
画像の16X16の指定色ピクセルと、全文字の字ピクセルを比べ、
一番一致する数が多い文字をその位置の文字とし、
それを画像サイズ分行うとかなのかな。

13 :デフォルトの名無しさん:2010/08/30(月) 20:36:33
AAって言ったらプロポーショナルフォントじゃないのか

14 :デフォルトの名無しさん:2010/08/30(月) 20:37:54
2chのAAはそうだね

15 :デフォルトの名無しさん:2010/09/03(金) 00:15:33
画像をアスキーの文字列に変換するのは簡単だけど
プロポーショナルフォントの文字列に変換するのは難しいよね?

16 :デフォルトの名無しさん:2010/09/04(土) 00:47:39
なんか画像処理してスネークとかで輪郭抽出して文字当てはめて
低周波成分は適当に「:」とかトーンになる文字で埋める感じか

6 KB
■ このスレッドは過去ログ倉庫に格納されています

★スマホ版★ 掲示板に戻る 全部 前100 次100 最新50

read.cgi ver 05.04.00 2017/10/04 Walang Kapalit ★
FOX ★ DSO(Dynamic Shared Object)