Android 修改Bitmap 图片像素的信息 R G B 颜色值详解

转载 2011年08月12日 15:43:32

要想修改Bitmap图片的 R G B信息 首先 得先拿到这张图片每个点的Color值 然后根据这个Color值 就可以算出对应的R G B 值 我们都知道在计算机语言中在内存中加载一张图片实际上是把图片的每个点的RGB信息写入内存 如果动态的修改了这些颜色信息 那绘制出来的图片就会改变。

修改图片的颜色值其实在很多地方都有用处,我记得以前我做J2ME游戏开发的时候 因为手机本身内存比较低 不能同时在内存中加载过多的图片 比如 在打怪的时候 玩家肯定不希望每次看到的怪物都一样 在不加大内存的情况下可以选择修改图片的R G B信息 就会给玩家耳目一新的感觉  这就是游戏调色板的原理。

接下来我介绍一下代码。下面这两张图片中的话筒图片中间的颜色是白色 在这里我动态的修改图片中间的颜色值 让它动起来。

            

//启动activity

  1. package cn.m15.demo;  
  2.   
  3.   
  4. import Android.app.Activity;  
  5. import Android.os.Bundle;  
  6. import Android.view.Window;  
  7.   
  8. public class demoActivity extends Activity {  
  9.     @Override  
  10.     public void onCreate(Bundle savedInstanceState) {  
  11.     super.onCreate(savedInstanceState);  
  12.     requestWindowFeature(Window.FEATURE_NO_TITLE);  
  13.   
  14.     setContentView(R.layout.main);  
  15.   
  16.     }  
  17. }  

//布局文件 自定义了一个View 绘制 图片

  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <RelativeLayout xmlns:Android="http://schemas.android.com/apk/res/android"  
  3.     Android:background="#888888"  
  4.     Android:layout_height="150dip" android:layout_width="120dip" >    
  5.     <cn.m15.demo.RecordingView  
  6.         Android:id="@+id/uvMeter"   
  7.         Android:layout_height="wrap_content"   
  8.         Android:layout_width="wrap_content"  
  9.         Android:gravity="center"  
  10.         />  
  11. </RelativeLayout>  

//自定义View

  1. package cn.m15.demo;  
  2.   
  3. import java.util.Random;  
  4.   
  5. import Android.content.Context;  
  6. import Android.graphics.Bitmap;  
  7. import Android.graphics.BitmapFactory;  
  8. import Android.graphics.Canvas;  
  9. import Android.graphics.Color;  
  10. import Android.graphics.Paint;  
  11. import Android.graphics.drawable.BitmapDrawable;  
  12. import Android.util.AttributeSet;  
  13. import Android.view.View;  
  14.   
  15. public class RecordingView extends View{  
  16.   
  17.   
  18.     Paint mPaint;  
  19.   
  20.     Bitmap mBitmap;  
  21.   
  22.     int mBitmapWidth = 0;  
  23.     int mBitmapHeight = 0;  
  24.   
  25.     int mArrayColor[] = null;  
  26.     int mArrayColorLengh = 0;  
  27.     long startTime = 0;  
  28.     int mBackVolume = 0;  
  29.   
  30.     public RecordingView(Context context) {  
  31.         super(context);  
  32.         init(context);  
  33.   
  34.     }  
  35.   
  36.     public RecordingView(Context context, AttributeSet attrs) {  
  37.         super(context, attrs);  
  38.         init(context);  
  39.     }  
  40.   
  41.     void init(Context context) {  
  42.         mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);  
  43.   
  44.         //在这里创建了一张bitmap   
  45.         mBitmap = BitmapFactory.decodeResource(context.getResources(),  
  46.             R.drawable.ic_vd_mic_on);  
  47.         //将这张bitmap设置为背景图片   
  48.         setBackgroundDrawable(new BitmapDrawable(mBitmap));  
  49.   
  50.         mBitmapWidth = mBitmap.getWidth();  
  51.         mBitmapHeight = mBitmap.getHeight();  
  52.   
  53.         mArrayColorLengh = mBitmapWidth * mBitmapHeight;  
  54.         mArrayColor = new int[mArrayColorLengh];  
  55.         int count = 0;  
  56.         for (int i = 0; i < mBitmapHeight; i++) {  
  57.         for (int j = 0; j < mBitmapWidth; j++) {  
  58.             //获得Bitmap 图片中每一个点的color颜色值   
  59.             int color = mBitmap.getPixel(j, i);  
  60.             //将颜色值存在一个数组中 方便后面修改   
  61.             mArrayColor[count] = color;  
  62.             //如果你想做的更细致的话 可以把颜色值的R G B 拿到做响应的处理 笔者在这里就不做更多解释   
  63.             int r = Color.red(color);  
  64.             int g = Color.green(color);  
  65.             int b = Color.blue(color);  
  66.               
  67.             count++;  
  68.         }  
  69.         }  
  70.         startTime = System.currentTimeMillis();  
  71.     }  
  72.   
  73.     /** 
  74.      * 返回一个随机数 
  75.      *  
  76.      * @param botton 
  77.      * @param top 
  78.      * @return 
  79.      */  
  80.     int UtilRandom(int botton, int top) {  
  81.         return ((Math.abs(new Random().nextInt()) % (top + 1 - botton)) + botton);  
  82.     }  
  83.   
  84.     @Override  
  85.     protected void onDraw(Canvas canvas) {  
  86.         super.onDraw(canvas);  
  87.         //每隔100毫秒设置一下填充的颜色区域   
  88.         if (System.currentTimeMillis() - startTime >= 100) {  
  89.         startTime = System.currentTimeMillis();  
  90.         setVolume(UtilRandom(0100));  
  91.         }  
  92.           
  93.         //用于刷新屏幕   
  94.         invalidate();  
  95.     }  
  96.   
  97.     public void setVolume(int volume) {  
  98.         int startY = 0;  
  99.         int endY = 0;  
  100.         boolean isAdd = false;  
  101.         //判断当前应该填充新区域 还是还原旧的区域    
  102.         if (mBackVolume > volume) {  
  103.         isAdd = false;  
  104.         startY = getValue(mBackVolume);  
  105.         endY = getValue(volume);  
  106.         } else {  
  107.         isAdd = true;  
  108.         startY = getValue(volume);  
  109.         endY = getValue(mBackVolume);  
  110.         }  
  111.         //没必要每次都循环图片中的所有点,因为这样会比较耗时。   
  112.         int count = startY * mBitmapWidth;  
  113.         //从图片须要填充或者还原 颜色的起始点 开始 到 终点    
  114.         for (int i = startY; i < endY; i++) {  
  115.         for (int j = 0; j < mBitmapWidth; j++) {  
  116.             if (isAdd) {  
  117.             //将需要填充的颜色值如果不是   
  118.             //在这说明一下 如果color 是全透明 或者全黑 返回值为 0   
  119.             //getPixel()不带透明通道 getPixel32()才带透明部分 所以全透明是0x00000000    
  120.             //而不透明黑色是0xFF000000 如果不计算透明部分就都是0了   
  121.             int color = mBitmap.getPixel(j, i);  
  122.             if (color != 0) {  
  123.                 mBitmap.setPixel(j, i, Color.BLACK);  
  124.             }  
  125.             } else {  
  126.             //如果是还原颜色 把现在点的颜色 赋值为之前保存颜色的数组   
  127.             mBitmap.setPixel(j, i, mArrayColor[count]);  
  128.             }  
  129.             count++;  
  130.         }  
  131.         }  
  132.         mBackVolume = volume;  
  133.     }  
  134.       
  135.     //通过百分比 根据图片宽高算出实际填充 高度   
  136.     public int getValue(int volume) {  
  137.         return mBitmapHeight - (mBitmapHeight * volume / 100);  
  138.     }  
  139.   
  140. }  

相关文章推荐

Android 修改Bitmap 图片像素的信息 R G B 颜色值 详解

要想修改Bitmap图片的 R G B信息 首先 得先拿到这张图片每个点的Color值 然后根据这个Color值 就可以算出对应的R G B 值 我们都知道在计算机语言中在内存中加载一张图片实际上是把...
  • jdsjlzx
  • jdsjlzx
  • 2011年07月25日 16:42
  • 2732

Android 修改Bitmap 图片像素的信息 R G B 颜色值 详解

修改Bitmap 图片像素的信息 R G B 颜色值       要想修改Bitmap图片的 R G B信息 首先 得先拿到这张图片每个点的Color值 然后根据这个Color值 就可以算出...

Android 修改Bitmap 图片像素的信息 R G B 颜色值 详解

       修改Bitmap 图片像素的信息 R G B 颜色值      要想修改Bitmap图片的 R G B信息 首先 得先拿到这张图片每个点的Color值 然后根据这个Color值 就可以算...

Android下正确获取屏幕触摸点下的图片像素值

 有的时候我们可能需要获取屏幕上触碰点下的图片像素值,比如我们在ImageView控件中显示了一张图片,当我们点击图片的某位置时想要获取这个点击位置的像素,最先想到的是使用Bitmap.getP...

获取图片像素颜色,转换为CSS3 box-shadow显示

原理: 1.使用FileReader 读取图片 2.使用canvas 的 getImageData 获取图片像素信息 3.将像素信息转换为CSS3 box-shadow 代码: ...
  • fdipzone
  • fdipzone
  • 2013年12月01日 01:20
  • 15297

图片像素批量修改软件

  • 2013年07月03日 10:48
  • 1.25MB
  • 下载

android 之修改图片的某一颜色值

首先我们来创建一个叫Image的类,这个类主要用来处理与图有关的一些操作。 package org.cn.tools; import java.io.IOException; import jav...

Unity3D中截图并修改图片像素重新保存至本地

第一次开始写博客,想把自己在平时遇到的一点小问题记录下来,也方便其他人参考 最近在用Unity3D做一个绿幕抠像的应用(囧一个,不要问我为什么用unity3D做),过程中需要对图片进行一些处理。 首先...

MIDP2.0中操作图片像素

  • 2008年04月14日 17:23
  • 124KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android 修改Bitmap 图片像素的信息 R G B 颜色值详解
举报原因:
原因补充:

(最多只允许输入30个字)