Проблема с преобразованием изображения в байтовый массив - PullRequest
2 голосов
/ 24 марта 2011

Для школы мы должны сделать проект по стенографии, я решил использовать bmp и вставить в него текст.Он работает нормально с обычными изображениями, но с того момента, когда у вас есть изображения с одинаковой последовательностью байтов, например, белая область или изображение, где у меня возникла проблема:Я делаю из байтового массива, где находится текст в изображении, и я читаю его обратно, байтовый массив изменился.в то время как единственное, что я сделал, это сделал изображение из байтового массива и обратно из байтового массива.

Это мой код:

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

    private void btnFile_Click(object sender, EventArgs e)
    {
        OpenFileDialog dialog = new OpenFileDialog();
        dialog.Filter = "bmp files (*.bmp)|*.bmp|All files (*.*)|*.*";
        dialog.Title = "Select a image";
        dialog.InitialDirectory = Application.ExecutablePath;

        if (dialog.ShowDialog() == DialogResult.OK)
        {
            txtText.Enabled = true;
            txtFile.Text = dialog.FileName;
            byte[] arImage = imageToByteArray(Image.FromFile(txtFile.Text));
            txtText.MaxLength = ((arImage.Length -54) /8)-5;
            lblCharLeft.Text = txtText.MaxLength+"";
            lblCharLeft.Tag = txtText.MaxLength;
            picOriginal.Image = Image.FromFile(dialog.FileName);
        }
    }
    private void btnSteganografie_Click(object sender, EventArgs e)
    {
        byte[] arImage = imageToByteArray(Image.FromFile(txtFile.Text));
        string input = txtText.Text;
        string inputInBits = GetBits(input);
        char[] bits = inputInBits.ToCharArray();
        int i = 0;
        for (i = 54; (i < arImage.Length & i < bits.Length+54); i++)
        {
            if ((int)arImage[i] == 0)
            {
                arImage[i] = (byte)2;
            }
            if ((int)arImage[i] == 255)
            {
                byte bBit = new byte();
                bBit = 2;
                arImage[i] = (byte)(arImage[i]-bBit);
            }
            int lastBit = ((int)arImage[i]) % 2;
            int dataBit = ((int)bits[i - 54])%2;
            if (lastBit != dataBit)
            {
                arImage[i]++;
            }
        }
        arImage[i] = 0;
        Image result = byteArrayToImage(arImage);
        picEncoded.Image = result;
        SaveFileDialog sfd = new SaveFileDialog();
        if (sfd.ShowDialog() == DialogResult.OK)
        {
            result.Save(sfd.FileName+".bmp",System.Drawing.Imaging.ImageFormat.Bmp);
        }
    }
    public string GetBits(string input)
    {
        StringBuilder sbBuilder = new StringBuilder();
         byte[] bytes = Encoding.Unicode.GetBytes(input);
        foreach (byte bByte in Encoding.Unicode.GetBytes(input))
        {
            int iByte = (int)bByte;

            for (int i = 7; i >= 0 & (iByte!=0 | i!=7); i--)
            {
                if (iByte - Math.Pow(2, i) >= 0)
                {
                    sbBuilder.Append("1");
                    iByte -= (int)Math.Pow(2, i);
                }
                else
                {
                    sbBuilder.Append("0");
                }
            }
        }
        return sbBuilder.ToString();
    }
    public byte[] imageToByteArray(System.Drawing.Image imageIn)
    {
        MemoryStream ms = new MemoryStream();
        imageIn.Save(ms, System.Drawing.Imaging.ImageFormat.Bmp);
        return ms.ToArray();
    }
    public Image byteArrayToImage(byte[] byteArrayIn)
    {
        //**********ERROR HAPPENS HERE *************
        MemoryStream ms = new MemoryStream(byteArrayIn);
        Image returnImage = Image.FromStream(ms);
        byte[] arImageTEST = imageToByteArray(returnImage);
        //**********byteArrayIn should be the same as arImageTEST ***********
        return returnImage;
    }
 }

1 Ответ

0 голосов
/ 24 марта 2011

Возможно, это как-то связано с доступной этой информацией здесь :

Вы должны держать поток открытым в течение всего времени жизни изображения.

Надеюсь, это поможет.

...