使用彩色固定宽度字符光栅化图像

本文关键字:图像 字符 彩色 固定宽度 | 更新日期: 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处理此问题