我正在制作一个将图像转换为彩色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个是正确着色的,但其余的都是相互着色的。
答案 0 :(得分:1)
我在这里看到的一些严重问题。通常,当光栅化时,要么循环遍历源像素,要么遍历目标像素。然而,你...循环大约2666((8000 - 2)/ 3)的固定值。在循环中做两次事情甚至改变循环变量(i)也是一个非常糟糕的主意。此外,由于您只有一个循环,因此您必须在一次运行中关注两个轴。这非常容易出错。
这种做法怎么样?:
1280/400 * 1 = 3,2
,大约为3(计算后的数字四舍五入)。第二个是1280/400 * 2 = 6
,依此类推。我认为这是你算法中最大的痛苦,因为你试图绕过6,5px的宽度。计算之后就把它绕过来!如果第一个是6,5,那么它是7,第二个是13 ......你明白了。