Bitmap.Save问题

时间:2010-03-14 21:10:05

标签: .net compact-framework bitmap save steganography

有人能告诉我你是否知道WM 6的Bitmap和隐写术有问题?

我正在研究一个项目,我必须在位图中隐藏数字签名。算法工作得很完美,因为直到我在存储器上有图像,位图包含修改后的字节。 但是在我保存图像(Bitmap.Save())并重新打开图像之后,这些字节就丢失了。当我说丢失时,我的意思是它们是拍摄照片时的原始字节。

谢谢。

这是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");

                }

            }
        }
    }

和open方法

    {
        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 :(得分:0)

您在评论中提到您只修改了LSB。如果有这样的话,我认为你的意思是最不重要的字节(而不是最重要的)。

.Net中的标准Bitmap为每像素32位,R,G和B组件各1个字节,alpha通道1个字节,通常被解释为透明度在支持透明度的设备中。

您可能只修改了Alpha通道值,而且由于Compact Framework图片框不支持透明度(我认为),Bitmap看起来与原来完全相同。

尝试修改一些不同的字节,你应该看到差异。

答案 1 :(得分:0)

首先,“最低有效位”实际上是正确的。最低有效位是每个R,G,B和A通道中的最低有效位,每个通道在32位位图中包含一个字节。

其次,您发布了“保存”和“打开”代码 - 您是否可以发布实际更改位图数据的代码?如果你没有修改pictureBox对象中的位,那么你确实只是保存原始图像,因为这是open方法放置数据的地方。