查看: 1125|回复: 8
|
图片转换去字符图案(C#)
[复制链接]
|
|
不知道有谁想试一试?
- using System;
- using System.Drawing;
- using System.IO;
- namespace BMP2ASCII
- {
- class Program
- {
- static void Main(string[] args)
- {
- char[] ascii = new char[] { '#', '#', '*', '*', '+', '+', '+', ';', ';', ':', ':', ',', ',', '.', '.', ' ', ' ' };
- Bitmap bmp = new Bitmap(@"C:\Users\ASUS\Pictures\horse.jpg");
- string txt = null;
- for (int y = 0; y < bmp.Height; y+=6)
- {
- for (int x = 0; x < bmp.Width; x+=3)
- {
- uint rgb = ((uint)bmp.GetPixel(x, y).ToArgb() & 0xFFFFFF) / 1048576;
- //Console.Write(ascii[rgb]);
- txt += ascii[rgb];
- }
- //Console.WriteLine();
- txt += "\r\n";
- }
- File.WriteAllText(@"C:\Users\ASUS\Desktop\horse.txt", txt);
- Console.ReadLine();
- }
- }
- }
复制代码
|
|
|
|
|
|
|
|
发表于 9-3-2021 12:14 PM
|
显示全部楼层
測試了。有趣的想法。
嘗試解說其中的做法:
- uint rgb = ((uint)bmp.GetPixel(x, y).ToArgb() & 0xFFFFFF) / 1048576;
- 1. 從圖畫上拿一個點,然後轉換去 argb。
- 2. 通過 & 0xFFFFFF 把 "Alpha" 去除。
- 3. 之後 / 1048576 (或者 right shift 20 bit),得到 0 ~ 15
- 4. 在從 char[] ascii 取出對應的字符。
- * char[] ascii 有 16 個 (0 ~ 15)多了一個,最後一個 char 是使用不到的,可以拿走。
- char[] ascii = new char[] {
- '#', '#', '*', '*', '+', '+', '+', ';',
- ';', ':', ':', ',', ',', '.', '.', ' ' };
复制代码
這個做法會把點上的 紅色強度 -> 轉換成不同的字符。
可以嘗試把顏色轉換成 灰度 Grayscale 再轉換成字符。
|
|
|
|
|
|
|
|
楼主 |
发表于 9-3-2021 03:25 PM
来自手机
|
显示全部楼层
flashang 发表于 9-3-2021 12:14 PM
測試了。有趣的想法。
嘗試解說其中的做法:
這個做法會把點上的 紅色強度 -> 轉換成不同的字符。
可以嘗試把顏色轉換成 灰度 Grayscale 再轉換成字符。
你果然是高手喔,我自己也不知道原来是取红色强度。 |
|
|
|
|
|
|
|
发表于 9-3-2021 09:16 PM
|
显示全部楼层
是使用了這樣的圖,然後發現了紅色不正常。。。
|
|
|
|
|
|
|
|
楼主 |
发表于 10-3-2021 01:22 AM
|
显示全部楼层
兄弟,再试一试这个,有16色的图案:
- using System;
- using System.Drawing;
- namespace BMP2ANSI
- {
- class Program
- {
- static int SimplifyColorComponent(int Value)
- {
- if (Value >= 52)
- return 63;
- else if (Value >= 32)
- return 42;
- else if (Value >= 12)
- return 21;
- return 0;
- }
- static byte DecreaseColor256(byte Red, byte Green, byte Blue)
- {
- byte[,] Palette16 = new byte[16, 3] { { 0, 0, 0 }, { 0, 0, 42 }, { 0, 42, 0 }, { 0, 42, 42 }, { 42, 0, 0 }, { 42, 0, 42 }, { 42, 42, 0 }, { 42, 42, 42 }, { 0, 0, 21 }, { 0, 0, 63 }, { 0, 42, 21 }, { 0, 42, 63 }, { 42, 0, 21 }, { 42, 0, 63 }, { 42, 42, 21 }, { 42, 42, 63 } };
- byte Color;
- byte Component;
- byte Value = 0;
- byte NewRed = 0;
- byte NewGreen = 0;
- byte NewBlue = 0;
- for (Component = 0; Component <= 2; Component++)
- {
- if (Component == 0)
- Value = (byte)SimplifyColorComponent(Red / 4);
- else if (Component == 1)
- Value = (byte)SimplifyColorComponent(Green / 4);
- else if (Component == 2)
- Value = (byte)SimplifyColorComponent(Blue / 4);
- Color = 0;
- while (Value != Palette16[Color, Component])
- {
- Color++;
- if (Color > 15)
- {
- Value -= 21;
- Color = 0;
- }
- }
- if (Component == 0)
- NewRed = Value;
- else if (Component == 1)
- NewGreen = Value;
- else if (Component == 2)
- NewBlue = Value;
- }
- for (Color = 0; Color <= 15; Color++)
- if ((Palette16[Color, 0] == NewRed) && (Palette16[Color, 1] == NewGreen) && (Palette16[Color, 2] == NewBlue))
- return Color;
- return 0;
- }
- static void Main(string[] args)
- {
- Bitmap bmp = new Bitmap(@"C:\Users\ASUS\Pictures\flower.png");
- for (int y = 0; y < bmp.Height; y += 28)
- {
- for (int x = 0; x < bmp.Width; x += 14)
- {
- Color rgb = bmp.GetPixel(x, y);
- Console.BackgroundColor = (ConsoleColor)DecreaseColor256(rgb.R, rgb.G, rgb.B);
- Console.Write(' ');
- }
- Console.BackgroundColor = ConsoleColor.Black;
- Console.WriteLine();
- }
- Console.ReadLine();
- }
- }
- }
复制代码 |
|
|
|
|
|
|
|
楼主 |
发表于 10-3-2021 01:24 AM
|
显示全部楼层
DecreaseColor256() 是22年前写的,当时还没有C#,用的是Pascal.
去年将它换成C#,方便我处理图像转换。 |
|
|
|
|
|
|
|
发表于 10-3-2021 01:42 PM
|
显示全部楼层
|
|
|
|
|
|
|
楼主 |
发表于 10-3-2021 10:10 PM
|
显示全部楼层
|
|
|
|
|
|
|
发表于 11-3-2021 09:13 AM
|
显示全部楼层
本帖最后由 flashang 于 11-3-2021 09:51 AM 编辑
以前有玩遊戲機,也有玩 emulator,也有做過一些小遊戲來玩。
|
|
|
|
|
|
|
| |
本周最热论坛帖子
|