ImageIO.write问题

ytr1209 2018-01-06 03:24:00
用异或加密解密图片,算法如下(加密解密算法都一样)
public void fibonacciyDncode(String filePath){
int iw;
int ih;
int R = 0;
int G = 0;
int B = 0;
int yR=0;
int yG=0;
int yB=0;
int RGB = 0;
//int RGB1=0;
int x,y,z;
x = 7;y = 33;//初始值(密钥)

try {
BufferedImage bi = ImageIO.read(new File(filePath));//读取图片
iw = bi.getWidth();
ih = bi.getHeight();
BufferedImage bi1 = new BufferedImage(iw, ih, BufferedImage.TYPE_INT_RGB);
for(int j = 0;j < ih ;j++){
for(int i = 0;i < iw ;i++){
z = ( x + y ) % 255;//Fibobacciy变换
x = y;
y = z;
//RGB1 = bi.getRGB(i, j);
Object data = bi.getRaster().getDataElements(i, j, null);//获取该点像素,并以object类型表示
R = bi.getColorModel().getRed(data);
G = bi.getColorModel().getGreen(data);
B = bi.getColorModel().getBlue(data);
yR = z^R;
yG = z^G;
yB = z^B;
RGB = (yR*256+yG)*256+yB;//R、G、B三个分量转换为RGB
if(RGB>8388608)RGB-=16777216;
bi1.setRGB(i, j, RGB);
}
}
ImageIO.write(bi1, "jpg", new File("E://dncode.jpg"));
} catch (Exception e) {
}

}

结果如下图所示(加密文件名为sun,加密后文件名为encode,解密后为decode)

可以看到解密的图片效果特别差,我用C#进行相同步骤的加密解密,结果解密图片和原图无区别。用C#解密以上java代码加密的图片,结果和如上图的decode一样。
于是我就把C#加密的图片导出,用上面所示的java代码进行解密,结果解密图片和原图无区别。
所以我就觉得用以上java代码加密后,输出加密图片时图片失真了,但是不知道具体原因是什么,求大神解决
...全文
867 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
ytr1209 2018-01-09
  • 打赏
  • 举报
回复
没人吗
oyljerry 2018-01-07
  • 打赏
  • 举报
回复
先不处理,只读取,然后再写入看看图片有没有变化
ytr1209 2018-01-07
  • 打赏
  • 举报
回复
噢对了,直接用以下代码读写图片,图片不会有变化
public void testWrite(String filePath){
try {
BufferedImage bi = ImageIO.read(new File(filePath));
ImageIO.write(bi, "jpg", new File("E://test1.jpg"));
} catch (IOException e) {
e.printStackTrace();
}
}

但是处理一个5x5的杂色图片时,结果如下图

左边是原图,右边是写出来的图片
ytr1209 2018-01-07
  • 打赏
  • 举报
回复
引用 1 楼 oyljerry 的回复:
先不处理,只读取,然后再写入看看图片有没有变化
单纯的读写是没问题的,只有上述java加密处理后写出才有变化

50,503

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧