Bitmap.Сохранить проблемы - PullRequest
2 голосов
/ 15 марта 2010

Может кто-нибудь сказать мне, если вы знаете, что проблема с битмапом и стеганографией для WM 6?

Я работаю над проектом, и мне нужно скрыть цифровую подпись в растровом изображении. Алгоритм работает отлично, так как пока у меня нет изображения в памяти, растровое изображение содержит измененные байты. Но после того, как я сохраню изображение (Bitmap.Save ()) и заново открою изображение, эти байты будут потеряны. Когда я говорю «потерянный», я имею в виду, что это оригинальные байты того времени, когда был сделан снимок.

Спасибо.

вот метод сохранения:

    {
        if (miSave.Enabled == false)
        {
            MessageBox.Show("Error, no image is opened. ", "Save Error");
        }
        else
        {
            SaveFileDialog sfd = new SaveFileDialog();

            sfd.Filter = "Bitmap|*.bmp|JPEG|*.jpg";

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

                if (sfd.FileName != "")
                {
                    Bitmap origImage = pictureBox.GetBitmap();
                    ///just a test to see that the bytes are the modified ones..and they are
                    byte[] origImageByte = ImageProcessing.ConvertBitmapToByteArray(origImage, origImage.Height * origImage.Width +54); 
                    origImage.Save(sfd.FileName, formatOfImage);
                    MessageBox.Show("Succesfully ", "Image Saved");

                }

            }
        }
    }

и открытый метод

    {
        if (pictureBox.Visible == false)
        {
            try
            {
                OpenFileDialog dlg = new OpenFileDialog();

                dlg.Filter = "Bitmap|*.bmp|JPEG|*.jpg";

                if (dlg.ShowDialog() == DialogResult.OK)
                {
                    Bitmap img = new Bitmap(dlg.FileName);


                    initialSize.Width = img.Width;
                    initialSize.Height = img.Height;

                    imageOpened();//this just does does some enabling buttons nothing more

                    pictureBox.SetBitmap(img, pixelSize);
                    pictureBox.ShowImage(img);

                    trackBar.TrackBarPosition(lblMinVal, lblMaxVal, this.Size);
                }
            }
            catch
            {
                DialogResult res = MessageBox.Show("Failed loading image");
            }
        }

}

Ответы [ 2 ]

0 голосов
/ 11 августа 2010

Во-первых, «Наименее значимый бит» на самом деле правильный. Наименее значимый бит - это наименее значимый бит в каждом из каналов R, G, B и, возможно, A, каждый из которых содержит один байт в 32-битной битовой карте.

Во-вторых, вы разместили код «Сохранить» и «Открыть». Можете ли вы опубликовать код, в котором вы фактически изменили растровые данные? Если вы не изменили биты в объекте pictureBox , тогда вы действительно просто сохраняете исходное изображение, так как именно метод open помещает данные.

0 голосов
/ 07 апреля 2010

Вы упомянули в комментарии, что изменяете только LSB. Я предполагаю, что вы имеете в виду младший значащий байт (и не менее значимый бит ), если есть такая вещь.

Стандарт Bitmap в .Net - 32 бита на пиксель, по 1 байту для компонентов R, G и B, и 1 байт для альфа-канала, что обычно интерпретируется как прозрачность в устройствах. которые поддерживают прозрачность.

Возможно, вы только изменяете значение альфа-канала, и поскольку графические блоки Compact Framework не поддерживают прозрачность (я думаю), Bitmap выглядит точно так же, как и изначально.

Попробуйте изменить несколько разных байтов, и вы увидите разницу.

...