使用彩色固定宽度字符光栅化图像
本文关键字:图像 字符 彩色 固定宽度 | 更新日期: 2023-09-27 18:27:46
uI正在制作一个程序,将图像转换为彩色的0,问题是0没有正确着色。为了得到任何接近图像的东西,我必须从2开始我的for循环,每次增加3。以下是我当前的代码:
public partial class MainWindow : Window
{
public MainWindow()
{
TextSelection textRange;
TextPointer start;
TextPointer startPos;
TextPointer endPos;
System.Drawing.Color x;
int pixelX = 3;
int pixelY = 8;
InitializeComponent();
Bitmap b = new Bitmap(@"E:'Documents'Visual Studio 2015'Projects'RichTextBox Image to ASCII'RichTextBox Image to ASCII'Akarin.jpg");
for (int i = 2; i < 8000; i += 3)
{
textRange = richTextBox1.Selection;
start = richTextBox1.Document.ContentStart;
startPos = start.GetPositionAtOffset(i);
endPos = start.GetPositionAtOffset(i + 1);
textRange.Select(startPos, endPos);
x = b.GetPixel(pixelX, pixelY);
textRange.ApplyPropertyValue(TextElement.ForegroundProperty, new SolidColorBrush(System.Windows.Media.Color.FromArgb(x.A, x.R, x.G, x.B)));
pixelX += 6;
if (pixelX > 1267)
{
pixelX = 3;
pixelY += 16;
}
i += 3;
textRange = richTextBox1.Selection;
start = richTextBox1.Document.ContentStart;
startPos = start.GetPositionAtOffset(i);
endPos = start.GetPositionAtOffset(i + 1);
textRange.Select(startPos, endPos);
x = b.GetPixel(pixelX, pixelY);
textRange.ApplyPropertyValue(TextElement.ForegroundProperty, new SolidColorBrush(System.Windows.Media.Color.FromArgb(x.A, x.R, x.G, x.B)));
pixelX += 7;
if (pixelX > 1267)
{
pixelX = 3;
pixelY += 16;
}
}
}
}
我之所以把代码放在for循环中两次,是因为当你取水平拟合的0的数量,并找出每个0占用了多少像素时,由于每个0之间的空间,它大约达到6.5。
编辑:还有一件事也很奇怪,如果你看左上角,它开始给0着色,连续的4个都是正确的颜色,但其他的都是每隔一个着色。
我在这里看到了一些严重的问题。通常在光栅化时,您可以循环通过源像素或通过目标像素。然而你。。。循环大约2666((8000-2)/3)的固定值。在一个循环中做两次事情,甚至更改循环变量(i)也是一个非常糟糕的主意。此外,由于你只有一个循环,你必须在一次运行中关心两个轴。这很容易出错。
这种方法怎么样?:
- 您的源图像为1280×720平方像素
- 由于你的零不是正方形的,你必须知道它们的纵横比。如果您知道可以计算需要多少行和列。你可能不想将它们1:1匹配,因为这会给你一个巨大而拉伸的图像
- 一旦知道需要多少行和列,就执行两个循环,一个在另一个内部,并调用循环变量targetX和targetY
- 如果你的目标图像假设在x轴上有400个零长,那么让第一个循环从1到400
- 在循环内部,从1280/400*targetX的源中拾取一个像素(颜色)。您的第一个目标像素将位于x位置
1280/400 * 1 = 3,2
,大约为3(计算后对数字进行四舍五入)。第二个是1280/400 * 2 = 6
等等。我认为这是你算法中最大的痛苦,因为你试图绕过6.5倍的宽度。计算完就四舍五入!如果第一个是6.5,那么就把它变成7,第二个是13……你明白了 - 同样的逻辑适用于Y轴,但您可以使用targetY处理此问题