有人能告诉我你是否知道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");
}
}
}
答案 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方法放置数据的地方。