Android下资源图片的加密和解密
2019獨(dú)角獸企業(yè)重金招聘Python工程師標(biāo)準(zhǔn)>>>
?? 轉(zhuǎn)載:http://blog.csdn.net/you_and_me12/article/details/7959349
?? apk文件使用解壓工具就能看到drawable等資源,但是有些游戲中的圖片資源卻是無法看到的。
這個(gè)問題探索了許久……
【1】圖片資源不放置在drawable文件下,放在assets中(但是解壓apk,同樣能看到圖片資源),以下說說使用方法。
分析:Ⅰ)當(dāng)圖片資源放在drawable中的時(shí)候,能有相應(yīng)的Id去解析:?BitmapFactory.decodeResource(res, id)
? ? ? 如果放置在assets下,就需要根據(jù)文件的名字去解析(Android提供AssetManager)。
? ? ? Ⅱ)可以自己建立多層目錄,方便管理。
? ? ? Ⅲ)這樣的解析過程,耗費(fèi)的時(shí)間要比根據(jù)Id解析要多(手機(jī)越來越智能,這點(diǎn)時(shí)間基本看不出來)。
代碼:
?/**?*?從Assets中讀取圖片?*?@param?fileName?:assets根目錄下?"a.png",有子文件夾的?"abc/a.png"?*?@return?*/??public?static?Bitmap?getImageFromAssets(Context?context,?String?fileName)????{????Bitmap?image?=?null;????AssetManager?am?=?context.getResources().getAssets();????try????{????InputStream?is?=?am.open(fileName);??image?=?BitmapFactory.decodeStream(is);??is.close();????}????catch?(IOException?e)????{????e.printStackTrace();????}????return?image;????}【2】圖片資源打包在jar下,然后導(dǎo)入工程(但是解壓apk,同樣能看到圖片資源)
分析:使用過一下第三方的jar包,在apk解壓后是看不到的,嘗試看看。最終發(fā)現(xiàn)jar包中的assets文件在apk中可見了。
Step1:打包jar
工程->右鍵->Export->Java/jar file->選擇需要打包的src 和 assets(如下圖)
Step2:解讀assets中的圖片,同【1】
Step3:打包apk,然后發(fā)現(xiàn)jar包中的assets和當(dāng)前工程的assets合并了!
【3】圖片資源加密,然后在assets文件下讀取(可以實(shí)現(xiàn)資源保護(hù),但是貌似比較耗時(shí))
分析:通過某種方式對(duì)圖片預(yù)先加密,然后在Android程序中解密,在轉(zhuǎn)換成Bitmap。
? ? ? 可能別的應(yīng)用程序就是這樣做的吧,哪位大神有妙招,給介紹一下吧!(下面介紹一下簡單方法)
Step1:加密,采用文件流方式,讀取資源,然后修改,最后生成文件(隨便格式都可以,就不能知道是圖片了)
? ? ? ?Ⅰ)每隔多少個(gè)字節(jié)添加一個(gè)指定的字節(jié)
? ? ? ?Ⅱ)每隔多少個(gè)字節(jié),交換字節(jié)(代碼示例)
?public?class?KMD1?{??public?static?void?encrypt(String?filePath){??byte[]?tempbytes?=?new?byte[5000];??try?{??InputStream?in?=?new?FileInputStream(filePath);??OutputStream?out?=?new?FileOutputStream(filePath.subSequence(0,?filePath.lastIndexOf("."))+"2.jpg")??while?(in.read(tempbytes)?!=?-1)?{//簡單的交換??byte?a?=?tempbytes[0];??tempbytes[0]?=?tempbytes[1];??tempbytes[1]?=?a;??out.write(tempbytes);//寫文件??}??}?catch?(IOException?e)?{??e.printStackTrace();??}??}??public?static?void?main(String[]?args){??KMD1.encrypt("D:/a.jpg");??}?? }【3】使用setPixel()和getPixel()對(duì)每個(gè)像素點(diǎn)進(jìn)行加密,然后在使用的時(shí)候在還原
分析:通過Bitmap.getPixel(x, y)得到color值,對(duì)color的rgb值加密操作,然后setPixel(x,y,color)
Step1:懶得寫了,直接貼代碼:
注意:bitmap一定要copy一份,然后第二個(gè)值為true才能對(duì)其setPixel,不然會(huì)報(bào)錯(cuò)的;代碼中的encrypt和decrypt就是你加密解密過程;
嚴(yán)重問題:對(duì)bitmap setPixel然后在getPixel,color值竟然不是set的值,有偏差,不知道為什么。有能解決這個(gè)問題的,請(qǐng)留言一下。
?Bitmap?temp_bitmap?=?image.copy(Bitmap.Config.ARGB_8888,?true);??int?width?=?temp_bitmap.getWidth();??int?height?=?temp_bitmap.getHeight();??int[]?pixels?=?new?int[width?*?height];????//temp_bitmap.getPixels(pixels,?0,?width,?0,?0,?width,?height);??for(int?i?=?0;?i?<?height;?i++)??{??for(int?j?=?0;?j?<?width;?j++)??{??int?color?=?temp_bitmap.getPixel(i,?j);??int?r?=?Color.red(color);??int?g?=?Color.green(color);??int?b?=?Color.blue(color);??int?alpha?=?Color.alpha(color);??//if(alpha?!=?0)??{??r?=?encrptyRGB(r,?2*(i*j));??g?=?encrptyRGB(g,?4*(i*j));??b?=?encrptyRGB(b,?6*(i*j));??color?=?Color.argb(alpha,?r,?g,?b);??pixels[width?*?i?+?j]?=?color;??//temp_bitmap.setPixel(i,?j,?color);??}??}??}??temp_bitmap.setPixels(pixels,?0,?width,?0,?0,?width,?height);??for(int?i?=?0;?i?<?height;?i++)??{??for(int?j?=?0;?j?<?width;?j++)??{??int?color?=?temp_bitmap.getPixel(i,?j);??int?r?=?Color.red(color);??int?g?=?Color.green(color);??int?b?=?Color.blue(color);??int?alpha?=?Color.alpha(color);??//if(alpha?!=?0)??{??r?=?decryptRGB(r,?2*(i*j));??g?=?decryptRGB(g,?4*(i*j));??b?=?decryptRGB(b,?6*(i*j));??color?=?Color.argb(alpha,?r,?g,?b);??pixels[width?*?i?+?j]?=?color;??//temp_bitmap.setPixel(i,?j,?color);??}??}??}??temp_bitmap.setPixels(pixels,?0,?width,?0,?0,?width,?height);??return?temp_bitmap;轉(zhuǎn)載于:https://my.oschina.net/u/223340/blog/418692
總結(jié)
以上是生活随笔為你收集整理的Android下资源图片的加密和解密的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 数据治理的理论实践与发展趋势
- 下一篇: onSaveInstanceState和