Android下资源图片的加密和解密

转载:http://blog.csdn.net/you_and_me12/article/details/7959349

   apk文件使用解压工具就能看到drawable等资源,但是有些游戏中的图片资源却是无法看到的。

这个问题探索了许久……

【1】图片资源不放置在drawable文件下,放在assets中(但是解压apk,同样能看到图片资源),以下说说使用方法。

分析:Ⅰ)当图片资源放在drawable中的时候,能有相应的Id去解析: BitmapFactory.decodeResource(res, id)

      如果放置在assets下,就需要根据文件的名字去解析(Android提供AssetManager)。

      Ⅱ)可以自己建立多层目录,方便管理。

      Ⅲ)这样的解析过程,耗费的时间要比根据Id解析要多(手机越来越智能,这点时间基本看不出来)。

代码:

 /** 
     * 从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下,然后导入工程(但是解压apk,同样能看到图片资源)

分析:使用过一下第三方的jar包,在apk解压后是看不到的,尝试看看。最终发现jar包中的assets文件在apk中可见了。

Step1:打包jar

工程->右键->Export->Java/jar file->选择需要打包的src 和 assets(如下图)


Step2:解读assets中的图片,同【1】

Step3:打包apk,然后发现jar包中的assets和当前工程的assets合并了!


【3】图片资源加密,然后在assets文件下读取(可以实现资源保护,但是貌似比较耗时)

分析:通过某种方式对图片预先加密,然后在Android程序中解密,在转换成Bitmap。

      可能别的应用程序就是这样做的吧,哪位大神有妙招,给介绍一下吧!(下面介绍一下简单方法)

Step1:加密,采用文件流方式,读取资源,然后修改,最后生成文件(随便格式都可以,就不能知道是图片了)

       Ⅰ)每隔多少个字节添加一个指定的字节

       Ⅱ)每隔多少个字节,交换字节(代码示例)

 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");  
    }  
}
  1. Step2:解密,与加密过程反向即可。
       /** 
* 从Assets中读取图片 
* @param fileName 
* @return 
*/  
 public static Bitmap getImageFromAssets(Context context, String fileName)    
 {    
     Bitmap image = null;    
     AssetManager am = context.getResources().getAssets();    
     try    
     {    
         InputStream is = am.open(fileName);  
         byte[] buffer = new byte[1000000];//足够大  
         is.read(buffer);  
         for(int i=0; i<buffer.length; i+= 5000){//与加密相同  
          byte temp = buffer[i];  
          buffer[i] = buffer[i+1];  
          buffer[i+1] = temp;  
         }  
         image = BitmapFactory.decodeByteArray(buffer, 0, buffer.length);  
         is.close();    
     }    
     catch (IOException e)    
     {    
         e.printStackTrace();    
     }    
     return image;    
 }

【3】使用setPixel()和getPixel()对每个像素点进行加密,然后在使用的时候在还原

分析:通过Bitmap.getPixel(x, y)得到color值,对color的rgb值加密操作,然后setPixel(x,y,color)

Step1:懒得写了,直接贴代码:

注意:bitmap一定要copy一份,然后第二个值为true才能对其setPixel,不然会报错的;代码中的encrypt和decrypt就是你加密解密过程;

严重问题:对bitmap setPixel然后在getPixel,color值竟然不是set的值,有偏差,不知道为什么。有能解决这个问题的,请留言一下。

 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;
时间: 2024-08-11 09:57:44

Android下资源图片的加密和解密的相关文章

Android下将图片载入到内存中

Android的系统的标准默认每一个应用程序分配的内存是16M.所以来说是很宝贵的,在创建应用的时候要尽可能的去节省内存,可是在载入一些大的文件的时候,比方图片是相当耗内存的,一个1.3M的图片,分辨率是2560X1920(宽X高)图片当载入到手机内存的时候就会请求19M的一块内存,这是远远超出了系统自带的内存空间,这时候应用程序就会挂掉,所以我们要进行图片的缩放处理,以下我就来带大家创建一个用来图片缩放的应用: 应用效果图例如以下: 核心代码的实现: package com.examp.loa

Android下将图片加载到内存中

Android的系统的标准默认每个应用程序分配的内存是16M.所以来说是非常宝贵的,在创建应用的时候要尽可能的去节省内存,但是在加载一些大的文件的时候,比如图片是相当耗内存的,一个1.3M的图片,分辨率是2560X1920(宽X高)图片当加载到手机内存的时候就会请求19M的一块内存,这是远远超出了系统自带的内存空间,这时候应用程序就会挂掉,所以我们要进行图片的缩放处理,下面我就来带大家创建一个用来图片缩放的应用: 应用效果图如下: 核心代码的实现: package com.examp.loadp

Android 下实现图片的移动

网上看到的demo,感觉很有趣,但是 实用性不是太强,记录一下. 源码下载地址:请戳这里----------------> Android 下实现图片的移动

Android 下压缩图片&mdash;微弱失真

Android下压缩图片的方法: 大概能将3M左右的图片压缩到100K左右, 几乎不失真. 代码如下: import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.OutputStream; import android.graphics.Bitmap; import android.graphics.BitmapFactory; public class BitmapUtil { /

android 文件简单的自定义加密和解密

在android或其他项目中常常会下载和上传文件,为了这些文件的安全我们与服务器统一加密的key,即可进行加密解密文件. 代码: /** * 文件file进行加密解密 * * @param fileUrl * 文件路径 * @param key * 密码 * @throws Exception */ public static boolean decryptOrEncrypt(String fileUrl) { try { File file = new File(fileUrl); if (!

使用tinypng优化Android的资源图片

tinypng 是一个支持压缩png和jpg图片格式的网站,通过其独特的算法(通过一种叫“量化”的技术,把原本png文件的24位真彩色压缩为8位的索引演示,是一 种矢量压缩方法,把颜色值用数值123等代替.)可以实现在无损压缩的情况下图片文件大小缩小到原来的30%-50%. 网站地址:https://tinypng.com/ 测试图片:   压缩后的图片:   可以明显的看见我们在压缩后将图片大小减少了将近一半,而且图片质量没有什么改变. 需要说明的是: tinypng支持png和jpg图片的压

Android下资源使用的方式-android学习之旅(五十三)

访问资源分为在java和xml中访问

Cocos2d-x 游戏资源(图片、XML、TXT等)打包加密 之 解密读取

自上一篇  Unity3d 游戏资源打包加密(图片/XML/TXT等) C#编码 (一)   介绍如何打包加密游戏资源已经好几月,却没有详细说明如何在游戏中去读取加密的资源,虽然聪明的程序员看一眼就知道如何逆向编码,但是还是详细说明一下,以作完结. 转自陈里陈外的博客 http://blog.csdn.net/huutu 星环游戏 http://www.thisisgame.com.cn Cocos2d-X 资源加密与解密 加密只有一篇即可,解密分为两篇,Cocos2d-x 篇 和 Unity3

Android开发之assets目录下资源使用总结

预前知识: Android资源文件分类: Android资源文件大致可以分为两种: 第一种是res目录下存放的可编译的资源文件: 这种资源文件系统会在R.java里面自动生成该资源文件的ID,所以访问这种资源文件比较简单,通过R.XXX.ID即可: 第二种是assets目录下存放的原生资源文件: 因为系统在编译的时候不会编译assets下的资源文件,所以我们不能通过R.XXX.ID的方式访问它们.那我么能不能通过该资源的绝对路径去访问它们呢?因为apk安装之后会放在/data/app/**.ap