2014-12-24 67 views
0

我想知道如何更改像素的最低有效位以隱藏字符。圖片必須保持不變,但我想在其中隱藏一條消息。如何隱藏像素內的字符

+1

你可以直接使用它們。只是存儲你的數據位 – talex

+0

你能解釋一下怎麼做嗎? 起點: 'bitmap.getPixel(0,0)....?' – astryk

+0

'RGB rgb = bitmap.getPixel(0,0); rgb.R = rgb.R&0xF7 | (data >> 0)& 0x01; bitmap.setPixel(0,0,rgb);'這不是java,而是顯示你的想法。 '(數據>> 0)'中的'0'是您存儲的位數的索引。 – talex

回答

0

爲了讓您的問題更加具體,我們假設您使用的是有限的7位字符集和純RGB圖像(無Alpha通道)。您可以將字符位分成2-2-3組。由於藍色是我們看到的變化最小的通道,因此可以將藍色通道中的3位組隱藏起來。以下的編碼/解碼的例子將使用Color對象來表示RGB三元組,但代碼應爲任何等效表示工作:

編碼

給定一個像素具有所述圖像中和某些原始值要編碼的字符,與

Color px; // The initial color in the image 
char ch; // The character to encode 
... 
// Store 2,2,3 bits of char in lowest bits of each pixel 
// ... & ~0x3 clears the lowest two bits, the or assigns the replacement bits 
Color newPx = new Color((px.getRed() & ~0x3) | ((ch & 0x60) >> 5), 
         (px.getGreen() & ~0x3) | ((ch & 0x18) >> 3), 
         (px.getBlue() & ~0x7) | (ch & 0x7)); 

解碼更換

Color px; // The image pixel with an encoded char 
... 
char ch = ((px.getRed() & 0x3) << 5) | 
      ((px.getGreen() & 0x3) << 3) | 
      (px.getBlue() & 0x7); 

您必須知道圖像的哪一部分包含修改後的像素才能使用。此外,如果您壓縮了它,請確保您的圖像數據是無損壓縮的。

0

要做到這一點,你需要定義一些約定來映射你的位。我們知道,在一個像素的ARGB顏色定義中,8位分配給Alpha,Red,Green和Blue值。因爲你不想將你的角色完全映射到一種顏色上,所以我懷疑你會希望在4個值中的每一個上均勻分解它。你也可能不想編輯這個alpha,但是你可以很容易地調整我提供的代碼來適應這個。這是一個int的結構。記住每個分量的值是8個比特(範圍0-255)

int color = (alpha << 24) | (red << 16) | (green << 8) | blue 

這就是說

int blue = color & 0xFF; 
int green = (color >> 8) & 0xFF; 
int red = (color >> 16) & 0xFF; 
int alpha = (color >> 24) & 0xFF; 

到字符c的最右邊的兩個比特隱藏到一個組件(紅色,綠色或藍色)使用

component = (component & 0xFC) | (c & 0x3); 

爲每種顏色重複並且在每次時間移位c之後兩次;

c >>= 2; 

其重新打包爲一個顏色

int color = (alpha << 24) | (red << 16) | (green << 8) | blue; 

解碼,突破回組件

int blue = color & 0xFF; 
int green = (color >> 8) & 0xFF; 
int red = (color >> 16) & 0xFF; 
int alpha = (color >> 24) & 0xFF; 

然後構造你的性格

char c = ((alpha & 0x3) << 6) | ((red & 0x3) << 4) | ((green & 0x3) << 2) | (blue & 0x3); 

這最後一位假定當你按照我列出的順序(alpha,紅色,綠色,藍色)隱藏組件中的位時。我希望這可以幫助你完成你的工作,可行的隱寫術。

編碼愉快!如果您有任何問題,請留下評論。