2011-03-03 29 views
2

我正在爲一個類項目開發一個隱寫術應用程序,允許用戶在另一個圖像中編碼一個祕密消息圖像。在修改像素整數值以包含消息值之後,我使用Bitmap.getPixel(x,y)來檢索像素信息。然後,我使用Bitmap.setPixel(x,y)將修改的像素放置在位圖中。解碼圖像並檢索隱藏的消息後,我注意到一些像素變色。我發現某些像素在修改後不包含正確的值。如果我使用位圖像素值在setPixel()和getPixel()位於同一像素之後有所不同

int before = encoded_value; 
bitmap.setPixel(x,y, before); 
int after = bitamp.getPixel(x,y); 

對於大多數像素==之前,然而在某些之前!=之後。如果我通過添加或減去之前不斷修改(這隻會稍微改變消息圖像中的顏色),然後再次設置像素,則前後的值仍然不同。在解碼圖像中關閉幾個像素並不是什麼大問題。但是,如果其中一個問題像素出現在我編碼消息圖像信息(圖像尺寸)的位置,解碼後的尺寸通常將包含非數字值,例如「2q3x300」。當應用程序嘗試將此字符串轉換爲整數值時,將會發生異常。我也嘗試使用整數緩衝區獲取和設置像素,但是相同的像素會導致問題。另外通過一些調試,我發現某些像素會導致問題,並且如果使用加倍的維度字符串「213213x300300」對圖像進行編碼,字符串將從圖像解碼爲「2q32q3x300300」,某些值會導致問題。我不確定這是從圖像文件解碼位圖時開始的問題,還是getPixel()和setPixel()方法中的錯誤。看起來某些像素會導致一點點關閉。在上面的例子1(其中包含ascii值爲49或00110001)被解碼爲q(其中包含ascii值113或01110001),只有一個比特值與該集合不同,並且可能會導致比特問題。位圖位於ARGB_8888中,因此應該能夠包含任何也可以包含在整數值中的值。爲了立體拍攝,我正在修改alpha,red,green和blue值的至少2位來存儲1個字節。我將消息圖像縮小爲RGB_332,以便它可以包含在最少位中。另一個例子是嘗試將像素設置爲-53029643。

I put   -53029643 = 1111 1100 1101 0110 1101 0100 1111 0101 
and get returns -53029387 = 1111 1100 1101 0110 1101 0101 1111 0101 
       ----------------------------------------------------XOR 
          = 0000 0000 0000 0000 0000 0001 0000 0000 = 256 

雖然這兩個只在綠色值的最小位有所不同。通過從每一位獲取至少2位來解碼該整數值得到00100101而不是00100001,這些字節的形式爲RRRGGGBB,因此綠色值從000變爲001,並且所得到的位圖將包含具有綠色值爲001000而不是000000,因爲解碼後的位圖在RGB_565中,並且從綠色開始的十進制值是8而不是0.這裏3個png圖像首先是載體圖像(將消息圖像編碼到圖像中)第二個圖像是消息圖像(在載體圖像中編碼的圖像),第三個是從載體圖像解碼之後的消息圖像。

載體圖像

carrier image

消息圖像

message image

解碼的消息的圖像。該圖像是8位顏色,更多紅色或綠色的像素是受此錯誤影響的像素。

decoded message

+0

圖像編碼後,它保存爲.png格式,因爲這是位圖可壓縮到的唯一無損類型。 – 2011-03-03 04:04:28

+0

我已經重新格式化了包含3個字節的圖像尺寸,第一個12位寬度,最後12位高度。這並不能解決錯誤,但前3個像素髮生錯誤的機會要少於以前的格式,如果x和y分量均小於10,則至少需要前5個像素。 – 2011-03-03 08:06:57

回答

1

在Android API This defect似乎涉及到我遇到了同樣的問題。由於在從像素陣列創建位圖或解碼到消息圖像時無法解決此問題,因此我必須在圖像解碼後使用圖像過濾。我使用的中值濾鏡已被修改以針對問題像素,這裏是帶有和不帶中值濾鏡的圖像示例。

未經過濾

unfiltered

過濾

filtered

0

你的位圖可能是設置爲565,即5位紅色,綠色6,5藍色。因此,對於紅色/藍色你只能有32個不同的值,對於綠色你只能有64個。

如果您需要更高的精度,您需要創建一個8888位圖。

例子:

Bitmap bitmap = Bitmap.createBitmap(128, 128, Bitmap.Config.ARGB_8888); 
+0

對不起,只是想我應該在這個問題上添加這個位圖,它位於ARGB_8888中,因此應該能夠包含任何也可以包含在整數值中的值。爲了隱寫起作用,我修改了alpha,red,green和blue值的至少2位來存儲1個字節。我將消息圖像縮小爲RGB_332,以便它可以包含在最少位中 – 2011-03-03 04:06:09

1

這看起來很像一個問題,我在那裏(僅適用於某些設備)從繪項目文件夾中加載的位圖將略有改變。我通過將位圖放入「raw」文件夾(例如res \ raw)來解決它。希望有所幫助。

0

我知道這是一箇舊的帖子,但是我能夠通過在ARGB整數中每個不正確的字節加減1來解決問題,直到每個字節的最低有效位都是正確的。我相信這是在每個字節的最低有效位正確的情況下,像素可以達到的最佳距離。

此外,我已經向谷歌彙報了這個錯誤。

相關問題