大家好。我在将文本隐藏到Jpeg图像时遇到问题。我将图像转换为二进制,将文本转换为二进制。我想将图像中每个字节的最后一位替换为我的字符串消息中的一位,但问题是图像没有成功显示。
以下是我正在使用的代码:
Dim myImage As Image = Image.FromFile(Server.MapPath("Images/image.jpg"))
'Image to byte[]
Dim imgMemoryStream As MemoryStream = New MemoryStream()
Dim imgByteArray As Byte() = Nothing
myImage.Save(imgMemoryStream, System.Drawing.Imaging.ImageFormat.Jpeg)
imgByteArray = imgMemoryStream.GetBuffer()
'Byte[] to image
imgMemoryStream = New IO.MemoryStream(imgByteArray)
myImage = Drawing.Image.FromStream(imgMemoryStream)
'Show it and check if the image is accordant with E:\VBproject\1.jpg.
Dim ln As Long
Dim str2 As String = "h"
Dim strArry As Byte() = New Byte(str2.Length) {}
strArry = System.Text.Encoding.Unicode.GetBytes(str2)
Dim i As Integer = 0
Dim b As Long = ((UBound(strArry) + 1) * 8) - 1
Dim Binstr(b) As String
For Each strbt As Byte In strArry
Dim binnarystr As String = Convert.ToString(strbt, 2).PadLeft(8, "0"c)
For Each Chr As Char In binnarystr
Binstr(i) += Chr
i += 1
Next
Next
'=====================================================
Dim ii As Integer = 1
'=================================================================
i = 0
Dim NewImageArray(imgByteArray.Length) As Byte
For Each Bt As Byte In imgByteArray
If i < UBound(Binstr) + 1 Then
Dim Bin As String = Convert.ToString(Bt, 2).PadLeft(8, "0"c)
Dim str As String
Bin = Bin.Remove(7, 1)
str = Bin.ToString() & Binstr(i).ToString()
ii = 1
ln = 0
For Each Chr As Char In str
If ii = 1 Then
ln += CInt(Chr.ToString()) * 128
ElseIf ii = 2 Then
ln += CInt(Chr.ToString()) * 64
ElseIf ii = 3 Then
ln += CInt(Chr.ToString()) * 32
ElseIf ii = 4 Then
ln += CInt(Chr.ToString()) * 16
ElseIf ii = 5 Then
ln += CInt(Chr.ToString()) * 8
ElseIf ii = 6 Then
ln += CInt(Chr.ToString()) * 4
ElseIf ii = 7 Then
ln += CInt(Chr.ToString()) * 2
ElseIf ii = 8 Then
ln += CInt(Chr.ToString()) * 1
End If
ii += 1
Next
NewImageArray(i) = ln
ii = 1
ln = 0
Else
NewImageArray(i) = Bt
End If
i += 1
Next
My.Computer.FileSystem.WriteAllBytes(Server.MapPath("Images/Alpha.jpg"), NewImageArray, False)
答案 0 :(得分:2)
我在这里看到三个问题。
首先,你打破了标题。图像文件通常具有两个部分:描述图像属性的标题,例如颜色调色板,大小,压缩级别,EXIF数据等,以及包含实际像素数据的数据部分。从第一个字节开始,您将更改标题中的信息,这可能会使图像完全无效。
第二个问题是您正在破坏图像像素数据。在大多数格式中,图像数据本身是压缩的。当您更改压缩字节的一位时,如果压缩数据甚至对该压缩算法仍然有效,则该更改在解压缩结果中具有放大效果...您可能无法再解压缩数据。
最后,每字节一位变化太大。你正在改写总数的八分之一,这是相当多的。每个像素一位是一个更好的起点,甚至可能是“有点”。
此方案需要做的是直接处理像素数据。这意味着您需要加载图像,而不仅仅是作为字节数组,而是尊重图像的属性并解压缩任何像素数据,就好像您要在屏幕上显示图像一样。然后,您可以读取像素,为每个像素更改一位,然后将图像重新保存为原始格式。