Просмотр монохромного растрового изображения в TextBox
Простите, если он был адресован, но я нигде не смог его найти. Я пытался сделать монохромное растровое изображение видимым в текстовом поле. Когда я открываю черно-белое растровое изображение, я хотел бы видеть форму изображения, состоящую из 1 и 0 (1 черный, 0 белый). Я подумал, что если я преобразую приведенный ниже int (i) в String, бинарный файл отобразится, но, думаю, это не так просто. У кого-нибудь есть опыт с этим? Надеюсь, есть простой способ выполнить такую функцию.
for (int i = 0x7F; i < 0xFF; i++) { __byteLookup[i] = Convert.ToString(i, 2); }
// 0x7F = 127, 0xFF = 255
Вот фотография Микки Мауса:
Вот как Микки выглядит в двоичном виде:
Я надеялся увидеть что-то подобное:
В моем коде у меня есть десятичные числа 1-126, обрабатываемые как фактические символы, но у меня есть 127-255, конвертируемые в двоичный.
В настоящее время я использую функцию перетаскивания и хотел бы сохранить это возможно. Вот мой текущий класс для этого перетаскивания RichTextBox.
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace PCL_Utility
{
public class DragDropRichTextBox : RichTextBox
{
public DragDropRichTextBox()
{
this.AllowDrop = true;
this.DragDrop += DragDropRichTextBox_DragDrop;
}
public static class BinaryFile
{
private static string[] __byteLookup = new string[256];
static BinaryFile()
{
// Display printable ASCII characters as-is
for (int i = 0x00; i < 0x7F; i++) { __byteLookup[i] = ((char)i).ToString(); }
// Display non-printable ASCII characters as \{byte value}
for (int i = 0; i <= 0x00; i++) { __byteLookup[i] = "\\" + i.ToString(); }
for (int i = 0x7F; i < 0xFF; i++) { __byteLookup[i] = Convert.ToString(i, 2); }
__byteLookup[0] = ""; // NULL
}
public static string ReadString(string filename)
{
byte[] fileBytes = System.IO.File.ReadAllBytes(filename);
return String.Join("", (from i in fileBytes select __byteLookup[i]).ToArray());
}
}
void DragDropRichTextBox_DragDrop(object sender, DragEventArgs e)
{
//string[] fileText = e.Data.GetData(DataFormats.FileDrop) as string[];
string[] fileText = e.Data.GetData(DataFormats.FileDrop) as string[];
if (fileText != null)
{
foreach (string name in fileText)
{
try
{
this.AppendText(BinaryFile.ReadString (name) + "\n -------- End of File -------- \n\n");
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
}
}
}
}
Любая помощь будет принята с благодарностью. Я в основном начинающий, поэтому, какой бы ответ ни пришел, я сделаю все возможное, чтобы понять. Но у меня могут быть некоторые вопросы.
1 ответ
Следующий метод должен дать вам строковый массив нулей и единиц, представляющих указанное изображение:
private static string ConvertToString(Bitmap image)
{
StringBuilder result = new StringBuilder();
StringBuilder imageLine = new StringBuilder();
// Iterate each pixel from top to bottom
for (int y = 0; y < image.Height; y++)
{
// Iterate each pixel from left to right
for (int x = 0; x < image.Width; x++)
{
Color pixelColour = image.GetPixel(x, y);
// Determine how "dark" the pixel via the Blue, Green, and Red values
// (0x00 = dark, 0xFF = light)
if (pixelColour.B <= 0xC8
&& pixelColour.G <= 0xC8
&& pixelColour.R <= 0xC8)
{
imageLine.Append("1"); // Dark pixel
}
else
{
imageLine.Append("0"); // Light pixel
}
}
// Add line of zero's and one's to end results
result.AppendLine(imageLine.ToString());
imageLine.Clear();
}
return result.ToString();
}
Это основано на предоставленной вами ссылке, но я исправил код в нескольких местах, например, то, как ранее сравнение значений пикселей также основывалось на альфе, и строковые представления значений.
Следующий код консольного приложения должен выводить результат, но я бы не рекомендовал его для больших изображений; может быть, вывод в текстовый файл вместо?
using System;
using System.Drawing;
using System.Text;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
// Read image into memory
var img = new Bitmap(@"C:\Temp\MickyMouse.png");
// Modify width of console buffer to keep each line of characters "on one line"
Console.SetBufferSize(img.Width + 10, img.Height + 10);
Console.WriteLine(ConvertToString(img));
Console.ReadLine();
}
private static string ConvertToString(Bitmap image)
{
// Code from above
}
}
}
Вам нужно будет добавить ссылку на System.Drawing
в проект для того, чтобы его скомпилировать.