1

如果已解决,请原谅我,但我无法在任何地方找到它。我一直在尝试让单色位图在文本框中可见。当我打开一个黑白位图图像时,我希望能够看到由 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); 
                    }
                }
            }
        }
    }
}

任何帮助将不胜感激。我主要是初学者,所以无论答案如何,我都会尽力理解。但我可能有一些问题。

4

1 回答 1

0

下面的方法应该给你一个由 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();
}

这是基于您提供的链接,但我在一些地方修改了代码,例如像素值的比较以前也是基于 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对项目的引用才能编译它。

于 2014-06-19T22:06:13.050 回答