将文本隐藏到图像中

时间:2013-05-22 15:57:51

标签: vb.net

大家好。我在将文本隐藏到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)

1 个答案:

答案 0 :(得分:2)

我在这里看到三个问题。

首先,你打破了标题。图像文件通常具有两个部分:描述图像属性的标题,例如颜色调色板,大小,压缩级别,EXIF数据等,以及包含实际像素数据的数据部分。从第一个字节开始,您将更改标题中的信息,这可能会使图像完全无效。

第二个问题是您正在破坏图像像素数据。在大多数格式中,图像数据本身是压缩的。当您更改压缩字节的一位时,如果压缩数据甚至对该压缩算法仍然有效,则该更改在解压缩结果中具有放大效果...您可能无法再解压缩数据。

最后,每字节一位变化太大。你正在改写总数的八分之一,这是相当多的。每个像素一位是一个更好的起点,甚至可能是“有点”。

此方案需要做的是直接处理像素数据。这意味着您需要加载图像,而不仅仅是作为字节数组,而是尊重图像的属性并解压缩任何像素数据,就好像您要在屏幕上显示图像一样。然后,您可以读取像素,为每个像素更改一位,然后将图像重新保存为原始格式。