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. }  

openCV—彩色图像R、G、B分量的提取与合并及其相关颜色空间的转化

一、函数简介 1、split—提取R、B、G分量(返回值顺序为:B、G、R) 函数原型:split(m, mv=None) m:彩图矩阵 mv:默认参数 2、merge—合并R、...
  • haluoluo211
  • haluoluo211
  • 2016年10月14日 11:44
  • 774

MPEG-7描述子(0)——颜色空间

颜色空间RGB计算机颜色显示器显示颜色的原理与彩色电视机一样,都是采用R、G、B相加混色的原理,通过发射出三种不同强度的电子束,使屏幕内侧覆盖的红、绿、蓝磷光材料发光而产生颜色的。这种颜色的表示方法称...
  • zzIymt
  • zzIymt
  • 2016年02月19日 12:49
  • 861

c#图像处理入门(-bitmap类和图像像素值获取方法)

c#图像处理入门(-bitmap类和图像像素值获取方法) 转自:http://blog.csdn.net/jiangxinyu/article/details/6222302 一.Bitm...
  • lxw907304340
  • lxw907304340
  • 2015年04月30日 16:29
  • 720

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

http://blog.csdn.net/xys289187120/article/details/6580777    修改Bitmap 图片像素的信息 R G B 颜色值   ...
  • h3c4lenovo
  • h3c4lenovo
  • 2013年04月25日 11:37
  • 1320

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

修改Bitmap 图片像素的信息 R G B 颜色值       要想修改Bitmap图片的 R G B信息 首先 得先拿到这张图片每个点的Color值 然后根据这个Color值 就可以算出对应...
  • zahuopuboss
  • zahuopuboss
  • 2017年03月25日 15:57
  • 222

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

原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://xys289187120.blog.51cto.com/3361352/657...
  • fth826595345
  • fth826595345
  • 2013年07月20日 17:14
  • 1540

机器学习sklearn19.0——决策树算法

一、基础知识——信息熵与条件信息熵 二、决策树的定义与直观理解
  • loveliuzz
  • loveliuzz
  • 2017年12月17日 10:11
  • 56

用Python给头像加上圣诞帽

正文共3743个字,9张图,预计阅读时间22分钟。01引言随着圣诞的到来,大家纷纷@官方微信给自己的头像加上一顶圣诞帽。当然这种事情用很多P图软件都可以做到。但是作为一个学习图像处理的技术人,还是觉得...
  • leadai
  • leadai
  • 2017年12月23日 00:00
  • 170

Opencv—分离多通道图像

记录自己的学习的笔记而已。目的:将一幅彩色图像三个单通道的图像表示出来。所用到的函数 cvSplit( const CvArr* src, CvArr* dst0, CvArr* dst1, CvAr...
  • Leaf2Tree
  • Leaf2Tree
  • 2016年10月10日 20:01
  • 179

matlab实现将彩色图像(R,G,B)色分量的直方图匹配,并计算其相关性

转自http://blog.csdn.net/Eagleest/article/details/34849947 函数 实现将彩色图像转化为直方图分量向量 [html]...
  • u013035197
  • u013035197
  • 2016年10月04日 16:43
  • 413
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android 修改Bitmap 图片像素的信息 R G B 颜色值详解
举报原因:
原因补充:

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