Rıza Berkay Ayçelebi Ответов: 1

Как я могу преобразовать строку в кодировке ASCII в BMP изображения


using System;
using System.IO;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Drawing.Imaging;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Windows.Media.Imaging;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }



        public BitmapImage ToImage(byte[] array)
        {
            using (System.IO.MemoryStream ms = new System.IO.MemoryStream(array))
            {
                BitmapImage image = new BitmapImage();
                image.BeginInit();
                image.StreamSource = ms;
                image.EndInit();
                return image;
            }
        }
        public static byte[] ImageToBinary(string imagePath)
        {
            FileStream fS = new FileStream(imagePath, FileMode.Open, FileAccess.Read);
            byte[] b = new byte[fS.Length];
            fS.Read(b, 0, (int)fS.Length);
            fS.Close();
            return b;
        }
        public static string StringToBinary(string data)
        {
            StringBuilder sb = new StringBuilder();

            foreach (char c in data.ToCharArray())
            {
                sb.Append(Convert.ToString(c, 2).PadLeft(8, '0'));
            }
            return sb.ToString();
        }
        private void button1_Click(object sender, EventArgs e)
        {

            if (openFileDialog1.ShowDialog() == DialogResult.OK)
            {


  
               string result = System.Text.Encoding.ASCII.GetString(ImageToBinary(openFileDialog1.FileName));

               System.IO.File.WriteAllText(@"C:\Users\Lenovo\Desktop\b.txt", result);
            }
        }
        public static Bitmap ByteToImage(byte[] blob)
        {
            MemoryStream mStream = new MemoryStream();
            byte[] pData = blob;
            mStream.Write(pData, 0, Convert.ToInt32(pData.Length));
            Bitmap bm = new Bitmap(mStream, false);
            mStream.Dispose();
            return bm;

        }

        private void button2_Click(object sender, EventArgs e)
        {
            if (openFileDialog1.ShowDialog() == DialogResult.OK)
            {
                string input = File.ReadAllText(openFileDialog1.FileName);
                byte[] toBytes = Encoding.ASCII.GetBytes(input);
               // System.IO.File.WriteAllText(@"C:\Users\Lenovo\Desktop\a.bmp", ToImage(toBytes));

                BitmapImage bmp1 = ToImage(toBytes);

                pictureBox1.Image = ByteToImage(toBytes);
              
            }

        }

        private void button3_Click(object sender, EventArgs e)
        {
           // SaveFileDialog sfd = new SaveFileDialog();
            Bitmap varBmp = new Bitmap(pictureBox1.Image);
            Bitmap newBitmap = new Bitmap(varBmp);
            varBmp.Dispose();
            varBmp = null;

           

            saveFileDialog1.Filter = "jpeg dosyası(*.jpg)|*.jpg|Bitmap(*.bmp)|*.bmp";


            saveFileDialog1.Title = "Kayıt İşlemi";


            saveFileDialog1.FileName = "resim";


            DialogResult sonuç = saveFileDialog1.ShowDialog();


            if (sonuç == DialogResult.OK)
            {
                newBitmap.Save(saveFileDialog1.FileName,ImageFormat.Bmp);
            }
        }
    }
}


Что я уже пробовал:

Например предположим что у нас есть изображение ниже

Т — Postimage.org[^]


преобразуйте изображение в строку ascii и сохраните как txt.Я хочу сделать обратный процесс.Я читаю текст ascii и конвертирую его в исходное изображение, но оно еще не полностью сформировано.Подобный этому.Где моя ошибка

ресим — Postimage.org[^]

1 Ответов

Рейтинг:
0

Midi_Mick

Ваша ошибка заключается в процессе преобразования. ASCII.ToString не преобразует двоичные данные в текст - он создает строку, содержащую двоичные данные. Для этого вам нужен алгоритм кодирования, такой как UUEncode или Base64.

Класс Convert имеет простые методы преобразования Base64. Поэтому, как только у вас есть свой байтовый массив из изображения, выполните

string text = Convert.ToBase64String(data)

и идти другим путем
byte[] data = Convert.FromBase64String(text)


Затем вы можете прочитать/записать файл с кодировкой ASCII, открыв StreamReader или StreamWriter с этой кодировкой.Параметр ASCII.


Rıza Berkay Ayçelebi

если я использую текстовый файл Base64String размером больше, чем файл изображения.Я хочу, чтобы размер текста и размер изображения были равны

Midi_Mick

Вы не можете этого сделать, если только не выполните какое-то сжатие (в этом случае файл больше не является текстом). Проблема в том, что существует 256 возможных байтовых символов, но только 96 текстовых символов ASCII. Чтобы сделать размеры файлов равными, вам нужно использовать двоичные символы, которыми является само изображение.

Rıza Berkay Ayçelebi

Я думал, что могу сделать сжатие для такого изображения, но теперь я в замешательстве.Как сжать растровый файл с помощью алгоритма Хаффмана и rle.вы сказали: "чтобы сделать размеры файлов равными, вам нужно использовать двоичные символы, то есть само изображение." как я могу это сделать вы можете мне помочь или вы можете отправить мне код

Midi_Mick

Да-просто забудьте о попытке преобразования в текст-считайте данные изображения как массив байтов и сохраняйте их на диске как этот массив байтов без изменений.
Если вы хотите применить сжатие huffman или rle, забудьте о тексте вообще и посмотрите алгоритмы (google "huffman image compression c#"). Примените их к вашему байтовому массиву перед его сохранением. Затем распакуйте, используя соответствующий алгоритм, когда вы читаете данные обратно.

Rıza Berkay Ayçelebi

Так что я не могу найти исходный код для hfufman для изображения везде текста.
Для изображения можно ли сжать код rgb ?