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

时间:2015-12-23 03:54:36

标签: c# .net wpf richtextbox

我正在制作一个将图像转换为彩色0的程序,问题是0没有正确着色。为了获得类似于图像的任何东西,我必须在2处开始循环并且每次增加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占用的像素数时,它会达到6.5左右,因为每个0之间的空间。

编辑:其他一些也很奇怪,如果你看左上角开始着色0,连续4个是正确着色的,但其余的都是相互着色的。

1 个答案:

答案 0 :(得分:1)

我在这里看到的一些严重问题。通常,当光栅化时,要么循环遍历源像素,要么遍历目标像素。然而,你...循环大约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,5px的宽度。计算之后就把它绕过来!如果第一个是6,5,那么它是7,第二个是13 ......你明白了。
  • Y轴也有相同的逻辑,但你用targetY处理它。