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

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

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

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

//启动activity

package cn.m15.demo;

import android.app.Activity;
import android.os.Bundle;
import android.view.Window;

public class demoActivity extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
	super.onCreate(savedInstanceState);
	requestWindowFeature(Window.FEATURE_NO_TITLE);

	setContentView(R.layout.main);

    }
}

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

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:background="#888888"
    android:layout_height="150dip" android:layout_width="120dip" >
	<cn.m15.demo.RecordingView
		android:id="@+id/uvMeter"
		android:layout_height="wrap_content"
		android:layout_width="wrap_content"
		android:gravity="center"
		/>
</RelativeLayout>

//自定义View

package cn.m15.demo;

import java.util.Random;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.drawable.BitmapDrawable;
import android.util.AttributeSet;
import android.view.View;

public class RecordingView extends View{

	Paint mPaint;

	Bitmap mBitmap;

	int mBitmapWidth = 0;
	int mBitmapHeight = 0;

	int mArrayColor[] = null;
	int mArrayColorLengh = 0;
	long startTime = 0;
	int mBackVolume = 0;

	public RecordingView(Context context) {
	    super(context);
	    init(context);

	}

	public RecordingView(Context context, AttributeSet attrs) {
	    super(context, attrs);
	    init(context);
	}

	void init(Context context) {
	    mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);

	    //在这里创建了一张bitmap
	    mBitmap = BitmapFactory.decodeResource(context.getResources(),
		    R.drawable.ic_vd_mic_on);
	    //将这张bitmap设置为背景图片
	    setBackgroundDrawable(new BitmapDrawable(mBitmap));

	    mBitmapWidth = mBitmap.getWidth();
	    mBitmapHeight = mBitmap.getHeight();

	    mArrayColorLengh = mBitmapWidth * mBitmapHeight;
	    mArrayColor = new int[mArrayColorLengh];
	    int count = 0;
	    for (int i = 0; i < mBitmapHeight; i++) {
		for (int j = 0; j < mBitmapWidth; j++) {
		    //获得Bitmap 图片中每一个点的color颜色值
		    int color = mBitmap.getPixel(j, i);
		    //将颜色值存在一个数组中 方便后面修改
		    mArrayColor[count] = color;
		    //如果你想做的更细致的话 可以把颜色值的R G B 拿到做响应的处理 笔者在这里就不做更多解释
		    int r = Color.red(color);
		    int g = Color.green(color);
		    int b = Color.blue(color);

		    count++;
		}
	    }
	    startTime = System.currentTimeMillis();
	}

	/**
	 * 返回一个随机数
	 *
	 * @param botton
	 * @param top
	 * @return
	 */
	int UtilRandom(int botton, int top) {
	    return ((Math.abs(new Random().nextInt()) % (top + 1 - botton)) + botton);
	}

	@Override
	protected void onDraw(Canvas canvas) {
	    super.onDraw(canvas);
	    //每隔100毫秒设置一下填充的颜色区域
	    if (System.currentTimeMillis() - startTime >= 100) {
		startTime = System.currentTimeMillis();
		setVolume(UtilRandom(0, 100));
	    }

	    //用于刷新屏幕
	    invalidate();
	}

	public void setVolume(int volume) {
	    int startY = 0;
	    int endY = 0;
	    boolean isAdd = false;
	    //判断当前应该填充新区域 还是还原旧的区域
	    if (mBackVolume > volume) {
		isAdd = false;
		startY = getValue(mBackVolume);
		endY = getValue(volume);
	    } else {
		isAdd = true;
		startY = getValue(volume);
		endY = getValue(mBackVolume);
	    }
	    //没必要每次都循环图片中的所有点,因为这样会比较耗时。
	    int count = startY * mBitmapWidth;
	    //从图片须要填充或者还原 颜色的起始点 开始 到 终点
	    for (int i = startY; i < endY; i++) {
		for (int j = 0; j < mBitmapWidth; j++) {
		    if (isAdd) {
			//将需要填充的颜色值如果不是
			//在这说明一下 如果color 是全透明 或者全黑 返回值为 0
			//getPixel()不带透明通道 getPixel32()才带透明部分 所以全透明是0x00000000
			//而不透明黑色是0xFF000000 如果不计算透明部分就都是0了
			int color = mBitmap.getPixel(j, i);
			if (color != 0) {
			    mBitmap.setPixel(j, i, Color.BLACK);
			}
		    } else {
			//如果是还原颜色 把现在点的颜色 赋值为之前保存颜色的数组
			mBitmap.setPixel(j, i, mArrayColor[count]);
		    }
		    count++;
		}
	    }
	    mBackVolume = volume;
	}

    //通过百分比 根据图片宽高算出实际填充 高度
	public int getValue(int volume) {
	    return mBitmapHeight - (mBitmapHeight * volume / 100);
	}

}
时间: 2024-11-04 22:49:34

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

修改Android FloatingActionButton的title的文字颜色及背景颜色实例详解

修改Android FloatingActionButton的title的文字颜色及背景颜色实例详解 首先看一张图片 我是在一个不错的开源的FloatingActionButton库基础上实现的,链接github开源库 参考图片的标记和代码里的注释.代码如下: <com.getbase.floatingactionbutton.FloatingActionsMenu android:id="@+id/fab_meau" android:layout_width="wra

Android xUtils更新到3.0后的基本使用规则详解_Android

 说实话,对于xUtils,是我最近才用到的开发框架(也是刚接触),对于其功能不得不说,简化了很多的开发步骤,可以说是非常好的开发工具,但是其最近更新到3.0也没有解决加载自定义ImageView报错的问题. xUtils简介 xUtils 包含了很多实用的android工具. xUtils 支持大文件上传,更全面的http请求协议支持(10种谓词),拥有更加灵活的ORM,更多的事件注解支持且不受混淆影响... xUitls 最低兼容android 2.2 (api level 8) 我总是喜欢

Android xUtils更新到3.0后的基本使用规则详解

说实话,对于xUtils,是我最近才用到的开发框架(也是刚接触),对于其功能不得不说,简化了很多的开发步骤,可以说是非常好的开发工具,但是其最近更新到3.0也没有解决加载自定义ImageView报错的问题. xUtils简介 xUtils 包含了很多实用的android工具. xUtils 支持大文件上传,更全面的http请求协议支持(10种谓词),拥有更加灵活的ORM,更多的事件注解支持且不受混淆影响... xUitls 最低兼容android 2.2 (api level 8) 我总是喜欢用

Android开发之基本控件和四种布局方式详解_Android

Android中的控件的使用方式和iOS中控件的使用方式基本相同,都是事件驱动.给控件添加事件也有接口回调和委托代理的方式.今天这篇博客就总结一下Android中常用的基本控件以及布局方式.说到布局方式Android和iOS还是区别挺大的,在iOS中有Frame绝对布局和AutoLayout相对布局.而在Android中的布局方式就比较丰富了,今天博客中会介绍四种常用的布局方式.先总结一下控件,然后再搞一搞基本方式,开发环境还是用的Mac下的Android Studio.开始今天的正题, 虽然A

Android开发之基本控件和四种布局方式详解

Android中的控件的使用方式和iOS中控件的使用方式基本相同,都是事件驱动.给控件添加事件也有接口回调和委托代理的方式.今天这篇博客就总结一下Android中常用的基本控件以及布局方式.说到布局方式Android和iOS还是区别挺大的,在iOS中有Frame绝对布局和AutoLayout相对布局.而在Android中的布局方式就比较丰富了,今天博客中会介绍四种常用的布局方式.先总结一下控件,然后再搞一搞基本方式,开发环境还是用的Mac下的Android Studio.开始今天的正题, 虽然A

Android ListView里控件添加监听方法的实例详解

Android ListView里控件添加监听方法的实例详解 关于ListView,算是android中比较常见的控件,在ListView我们通常需要一个模板,这个模板指的不是住模块,而是配置显示在ListView里面的东西,今天做项目的时候发现想要添加一个ImageView监听方法,发现崩了,也许是好久没有动ListView竟然忘了不能直接在主UI的xml文件里面调用其他xml文件的控件,哪怕ListView用的是这个xml文件. [错误示范]: 直接调用ImageView这个控件是ListV

Android开发实现带有反弹效果仿IOS反弹scrollview教程详解_Android

首先给大家看一下我们今天这个最终实现的效果图:   这个是ios中的反弹效果.当然我们安卓中如果想要实现这种效果,感觉不会那么生硬,滚动到底部或者顶部的时候.当然 使用scrollview是无法实现的.所以我们需要新建一个view继承ScrollView package davidbouncescrollview.qq986945193.com.davidbouncescrollview; import android.annotation.SuppressLint; import androi

Android判断后台服务是否开启的两种方法实例详解

Android判断后台服务是否开启的两种方法实例详解 最近项目用到后台上传,就开启了一个服务service. 但是刚开始用这种方法,有些机型不支持:酷派不支持.然后又换了第二种判断方法. // public boolean isServiceWork(Context mContext, String serviceName) { // boolean isWork = false; // ActivityManager myAM = (ActivityManager) mContext // .

Android 实现缩小图片像素

自定义View类控制焦点以及android现实缩小图片的像素和如何通过BitmapFactory读得图片资源,做了笔记.以下代码提供给大伙参考.   package com.view; import java.util.HashMap; import com.pojo.Constants; import com.test.R; import android.content.Context; import android.graphics.Bitmap; import android.graphi