在 TextBox 中查看单色位图
Posted
技术标签:
【中文标题】在 TextBox 中查看单色位图【英文标题】:Viewing Monochrome Bitmap in TextBox 【发布时间】:2014-08-09 12:33:19 【问题描述】:如果已解决,请原谅我,但我无法在任何地方找到它。我一直在尝试让单色位图在文本框中可见。当我打开一个黑白位图图像时,我希望能够看到由 1 和 0(1 黑色,0 白色)组成的图像形式。我想如果我将下面的 int(i) toString 转换为二进制会显示,但我想这并不容易。有人对这个有经验么?希望有一种简单的方法来执行这种功能。
for (int i = 0x7F; i < 0xFF; i++) __byteLookup[i] = Convert.ToString(i, 2);
// 0x7F = 127, 0xFF = 255
这是米奇老鼠的照片:
这是 Micky 在二进制文件中的样子:
我希望看到这样的事情发生:
在我的代码中,我将小数 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 和 0”示例看起来像 ascii art,这与图像的二进制不同。 凯文。我认为这是完美的。这不能是二进制的,但实际上是 ASCII 艺术。我一直在为此绞尽脑汁。我可能只需要 95 个可打印的 ASCII 字符并将不可打印的 ASCII 字符留空。这是一个开始! 你应该正式回答,如果有效,我会给你绿色检查。 不幸的是,我认为这不是答案。在对“位”映射图像进行一些研究之后,我确实认为这是二进制的。我认为这只是确保正确的角色在那里的问题。不确定。我确实注意到我正在使用的文件中的位图都在第 128 位以上。 Ascii 艺术全是可打印字符。我在做什么使用不可打印的字符。 【参考方案1】:下面的方法应该给你一个由 0 和 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();
这是基于the link you provided,但我在一些地方修改了代码,例如像素值的比较以前也是基于 Alpha 的,以及值的字符串表示形式。
以下控制台应用程序代码应该会输出结果,但我不建议将其用于大图像;也许改为输出到文本文件?
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
的引用才能编译。
【讨论】:
注意我选择了0xC8 (200)
的任意值,这样代码不仅将黑色像素视为1,将所有其他灰色到白色的阴影视为0。它适用于提供的图像在问题中,但可能需要针对其他图像进行调整。
我是一个非常新的程序员。这是我写的第二件事,也是最复杂的。我会继续努力的。谢谢你的帮助。我实际上只需要黑白。此外,只是一个侧面的想法。我将要导入的文件格式是一个文本文件,中间包含一个位图图像,然后是下面的更多文本。我希望使位图和文本都可见。我上面的代码目前允许我的文本正确显示,但位图是一团糟。我将进行编辑,以便您了解我的意思。以上是关于在 TextBox 中查看单色位图的主要内容,如果未能解决你的问题,请参考以下文章
求单色位图,16色位图,24色位图和256色位图之间的区别?
求单色位图,16色位图,24色位图和256色位图之间的区别?