From window, to wind

趣味のゲームとJavaプログラムなどについて 適当に書き綴るブログ

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

ファミコンカラーで描画する処理[C#・WPF]

WPFのWriteableBitmapをファミコンカラー54色で描画する処理を作りました。
ファミコンカラーは下記のブログの色見本の画像からRGBデータを調べました。
NESカラー色見本ファイル(ファミコンカラー色見本ファイル

処理自体は単純で54色すべてについてRGBデータの距離を計算し、
一番近い色に置き換える処理となっています。
一部色斑が出るみたいなので前後左右の色と比較するような処理を組み込むべきかもしれませんね。
NESColor.jpg

他の言語の方でも似たような処理で出来ると思いますので、
RGBデータを含めてソースコードを置いておきます。
続きからご確認ください。
        private static byte[] rdata = { 255, 187, 126, 143, 96, 66, 37, 158, 81, 66, 44, 190, 158, 143, 96, 223, 239, 215, 151, 255, 255, 215, 174, 255, 255, 223, 158, 255, 255, 190, 119, 255, 231, 135, 73, 199, 151, 81, 59, 158, 111, 73, 59, 158, 111, 73, 51, 158, 96, 66, 51, 158, 96, 0 };
private static byte[] gdata = { 255, 187, 126, 207, 158, 96, 0, 182, 127, 66, 0, 174, 111, 66, 23, 174, 96, 66, 37, 182, 96, 66, 23, 199, 119, 81, 51, 215, 158, 111, 66, 239, 207, 135, 88, 239, 231, 158, 104, 239, 239, 166, 107, 255, 223, 158, 96, 255, 207, 143, 81, 158, 96, 0 };
private static byte[] bdata = { 255, 187, 126, 255, 255, 248, 174, 255, 255, 255, 183, 255, 255, 239, 158, 255, 255, 190, 119, 231, 174, 96, 51, 182, 51, 0, 0, 158, 0, 0, 0, 143, 37, 0, 0, 127, 0, 0, 0, 158, 66, 23, 0, 199, 143, 104, 66, 239, 223, 190, 127, 158, 96, 0 };

public static WriteableBitmap getNESColorBitmap(WriteableBitmap wb) {
int width = wb.PixelWidth;
int height = wb.PixelHeight;
byte[] pxdata = new byte[height * width * 4];
int stride = width * ((wb.Format.BitsPerPixel + 7) / 8);

wb.CopyPixels(pxdata, stride, 0);
for (int y = 0; y < height; y++) {
for (int x = 0; x < width; x++) {

double maxdistance = 255 * 255*3;
int index = 0;
int r = pxdata[4 * (y * width + x) + 2];
int g = pxdata[4 * (y * width + x) + 1];
int b = pxdata[4 * (y * width + x) + 0];

for (int i = 0; i < 54; i++) {
double nowdistance=Math.Pow(r-rdata[i],2);
nowdistance+=Math.Pow(g-gdata[i],2);
nowdistance+=Math.Pow(b-bdata[i],2);
if (maxdistance > nowdistance) {
index = i;
maxdistance = nowdistance;
}
}

pxdata[4 * (y * width + x) + 2] = rdata[index];//red
pxdata[4 * (y * width + x) + 1] = gdata[index];//green
pxdata[4 * (y * width + x) + 0] = bdata[index];//blue
if (pxdata[4 * (y * width + x) + 3] != 0) {
pxdata[4 * (y * width + x) + 3] = 255;//arufa
}
}
}
WriteableBitmap outputBitmap = new WriteableBitmap(width, height, 96, 96,
PixelFormats.Bgra32, null);
outputBitmap.WritePixels(new Int32Rect(0, 0, width, height), pxdata, stride, 0);
return (outputBitmap);
}
スポンサーサイト

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック

トラックバックURLはこちら
http://kagenyan.blog69.fc2.com/tb.php/141-ee3d5c37
この記事にトラックバックする(FC2ブログユーザー)

FC2Ad

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。