資源簡介
沒有積分的私聊我 看到消息百分百發給你
1、算法核心:
1、讀取圖片A,獲得其RGB三個通道數據并轉換成三個矩陣a1,a2,a3。
2、讀取文件B,將其轉換成比特流b。
3、遍歷b,得到比特b1,b2,b3,b4,b5,b6等等,將b1代替a1第一個元素的最低位,將b2代替a2第一個元素的最低位,將b3代替a3第一個元素的最低位,將b4代替a1第二個元素的最低位,以此類推。
2、具體實現:
1、隱寫:
1、使用java ImageIO讀取圖片,獲取其RGB通道信息。
2、使用java NIO讀取被嵌入的文件,將其轉換為byte數組,需要特別指出的是原生方法得到是byte類型的數組,但是算法實現需要更加精細的操作,所以還需要對得到的byte數組進行進一步的轉換封裝,將其轉換成形如10101的數組。例如,讀取文件得到byte數組的第一個元素為63,需將63轉換為00111111數組。并且保存好文件的長度。
3、按照算法,遍歷形如10101的數組
1、如果遍歷到的值為0,將矩陣對應的矩陣元素與0xfe進行與運算,將最低位置為0
2、如果遍歷到的值為1,將矩陣對應的矩陣元素與0x01進行或運算,將最低位置為1
4、將步驟3得到的經過經過隱寫的矩陣寫為一張新的圖片。
3、讀取
1、使用java ImageIO讀取圖片,獲取其RGB通道信息。
2、使用隱寫步驟3得到的文件長度,遍歷圖片的像素矩陣,需要特別指出的是因為后續步驟還需要進行進一步的轉化,所以這一步是將得到的“100100......”序列每八位封裝為一個數組,最終得到一些數組集合,每個數組包含八位二進制序列。
3、將步驟2得到的數組進行轉換,例如00111111應該轉換為byte類型數值為63的數字,10111111轉換為-63。這一步會得到一個byte類型的數組。
4、將步驟3得到的byte類型數組寫入文件,需要指出的是寫入的文件形式應該和隱寫模塊步驟二中讀入的文件形式一致。
3、程序使用方法
1、安裝Java8
2、使用命令行進入jar文件所在目錄下,使用命令 java -jar 2016115130.jar
3、安裝提示輸入嵌入和被嵌入的文件名字,注意路徑問題

代碼片段和文件信息
package?decrypt;
import?encrypt.ReadAndWriteFile;
import?javax.imageio.ImageIO;
import?java.awt.image.BufferedImage;
import?java.awt.image.Raster;
import?java.io.File;
import?java.io.IOException;
/**
?*?提取被隱寫入圖片的文件類
?*/
public?class?Decrypt?{
????public?static?void?doDecrypt(String?pathint?fileLenString?resultFile){
????????try{
//????????????1、讀入圖片
????????????BufferedImage?bimg?=?ImageIO.read(new?File(path));
????????????Raster?raster?=?bimg.getData();
//????????????2、獲得圖片的RGB通道信息,并且將其轉換為矩陣,
//????????????應該注意的是java并不支持矩陣數據類型,所以這里的實現還是數組,只是人為地看成矩陣而已
????????????int?[]?temp?=?new?int[raster.getWidth()*raster.getHeight()*raster.getNumBands()];
????????????int[]?pixels??=?raster.getPixels(00raster.getWidth()raster.getHeight()temp);
????????????int?[]?byteArr?=?new?int[pixels.length];
//????????????3、核心步驟:將得到地RGB矩陣元素按照規律將每個元素模2,得到其最低位的數值
????????????for(int?index?=?0;?index????????????????byteArr[index]?=?pixels[index]?%?2;
????????????}
????????????byte?[]resultArr?=?new?byte[fileLen];
????????????int?resultArrIndex?=?0;
//????????????4、核心步驟2:將得到的比特數組轉化為字節數組
????????????for(int?index?=?0;?index?????????????????byte?b?=?0;
????????????????int?a?=?0;
????????????????if?(byteArr[index]?==?0)?{
?????????????????????a?=??byteArr[index?+?1]?*?64?+?byteArr[index?+?2]?*?32
????????????????????????????+?byteArr[index?+?3]?*?16?+?byteArr[index?+?4]?*?8?+?byteArr[index?+?5]?*?4
????????????????????????????+?byteArr[index?+?6]?*?2?+?+byteArr[index?+?7];
?????????????????????b?=?(byte)?a;
????????????????}else?{
?????????????????????a?=??byteArr[index?+?1]?*?64?+?byteArr[index?+?2]?*?32
????????????????????????????+?byteArr[index?+?3]?*?16?+?byteArr[index?+?4]?*?8?+?byteArr[index?+?5]?*?4
????????????????????????????+?byteArr[index?+?6]?*?2?+?+byteArr[index?+?7];
?????????????????????????b?=?(byte)?(0-a);
????????????????????}
????????????????if?(resultArrIndex?????????????????????resultArr[resultArrIndex]?=?b;
????????????????????resultArrIndex++;
????????????????????}
????????????????}
//?????????????5、將得到的字節數組寫入文件
????????????ReadAndWriteFile.ByteArr2File(resultArr?resultFile);
????????}catch?(IOException?e){
????????????e.printStackTrace();
????????}
????}
}
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????目錄???????????0??2019-06-30?08:17??.idea\
?????文件???????????6??2019-06-15?23:44??.idea\.name
?????文件?????????577??2019-06-30?07:59??.idea\compiler.xm
?????文件?????????308??2019-06-18?20:24??.idea\encodings.xm
?????目錄???????????0??2019-06-17?12:38??.idea\inspectionProfiles\
?????文件????????1444??2019-06-15?23:44??.idea\inspectionProfiles\Project_Default.xm
?????目錄???????????0??2019-06-17?12:38??.idea\libraries\
?????文件?????????335??2019-06-15?23:49??.idea\libraries\opencv_330.xm
?????文件?????????530??2019-06-17?12:47??.idea\misc.xm
?????文件????????8915??2019-06-16?19:53??.idea\uiDesigner.xm
?????文件???????41686??2019-06-30?08:17??.idea\workspace.xm
?????文件??????????81??2019-06-15?23:45??2016115130.iml
?????文件?????????416??2019-06-15?23:44??pom.xm
?????目錄???????????0??2019-06-17?12:38??src\
?????目錄???????????0??2019-06-17?12:38??src\main\
?????目錄???????????0??2019-06-18?09:39??src\main\java\
?????目錄???????????0??2019-06-30?08:11??src\main\java\decrypt\
?????文件????????2629??2019-06-30?08:11??src\main\java\decrypt\Decrypt.java
?????目錄???????????0??2019-06-30?08:17??src\main\java\encrypt\
?????文件????????3128??2019-06-30?08:17??src\main\java\encrypt\Encrypt.java
?????目錄???????????0??2019-06-18?12:25??src\main\java\utils\
?????文件????????1650??2019-06-18?12:25??src\main\java\utils\Byte2BitArr.java
?????文件????????1583??2019-06-18?09:41??src\main\java\utils\ReadAndWriteFile.java
?????目錄???????????0??2019-06-18?09:54??src\main\resources\
?????目錄???????????0??2019-06-17?12:38??src\test\
?????目錄???????????0??2019-06-18?10:03??src\test\java\
?????文件?????????266??2019-06-18?10:03??src\test\java\GenTest.java
?????目錄???????????0??2019-06-18?10:03??target\
?????目錄???????????0??2019-06-18?12:25??target\classes\
?????目錄???????????0??2019-06-18?12:22??target\classes\decrypt\
?????文件????????1835??2019-06-18?12:22??target\classes\decrypt\Decrypt.class
............此處省略27個文件信息
- 上一篇:java連連看源代碼
- 下一篇:基于Java的移動臂磁盤調度算法動態顯示
評論
共有 條評論