0

皆さんこんにちは。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)
4

1 に答える 1

2

ここには 3 つの問題があります。

まず、ヘッダーを壊しています。画像ファイルには通常、カラー パレット、サイズ、圧縮レベル、EXIF データなどの画像の属性を記述するヘッダーと、実際のピクセル データを含むデータ セクションの 2 つのセクションがあります。最初のバイトから開始すると、ヘッダー内の情報が変更され、イメージが完全に無効になる可能性があります。

2 番目の問題は、画像のピクセル データを壊していることです。画像データ自体は、ほとんどの形式で圧縮されています。圧縮されたバイトの 1 ビットを変更すると、圧縮データがその圧縮アルゴリズムに対してまだ有効である場合でも、その変更は解凍結果に大きな影響を与えます... データをまったく解凍できない可能性があります。

最後に、1 バイトあたり 1 ビットでは変更が多すぎます。全体の 8 分の 1 を書き直していますが、これはかなりの量です。1 ピクセルあたり 1 ビットから開始するのが適切であり、それでさえ「少し」多くなる可能性があります。

このスキームが機能するために必要なことは、ピクセル データを直接処理することです。これは、イメージをバイト配列としてロードするだけでなく、イメージを画面に表示する場合と同様に、イメージのプロパティを尊重し、ピクセル データを解凍する必要があることを意味します。次に、ピクセルを読み取って、ピクセルごとに 1 ビットを変更し、画像を元の形式に再保存します。

于 2013-05-22T16:22:33.810 に答える