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);
	}

}


相关文章
|
17天前
|
存储 消息中间件 人工智能
【03】AI辅助编程完整的安卓二次商业实战-本地构建运行并且调试-二次开发改注册登陆按钮颜色以及整体资源结构熟悉-优雅草伊凡
【03】AI辅助编程完整的安卓二次商业实战-本地构建运行并且调试-二次开发改注册登陆按钮颜色以及整体资源结构熟悉-优雅草伊凡
53 3
|
5月前
|
API Android开发 开发者
Android颜色渐变动画效果的实现
本文介绍了在Android中实现颜色渐变动画效果的方法,重点讲解了插值器(TypeEvaluator)的使用与自定义。通过Android自带的颜色插值器ArgbEvaluator,可以轻松实现背景色的渐变动画。文章详细分析了ArgbEvaluator的核心代码,并演示了如何利用Color.colorToHSV和Color.HSVToColor方法自定义颜色插值器MyColorEvaluator。最后提供了完整的源码示例,包括ColorGradient视图类和MyColorEvaluator类,帮助开发者更好地理解和应用颜色渐变动画技术。
150 3
|
5月前
|
Java Android开发
Android背景颜色滑动渐变效果(上下滑动,左右滑动)
本文分享了一种通过ScrollView实现滑动变色效果的简单方法。主要步骤包括:1) 在布局中添加ScrollView并确保内容可滑动;2) 获取屏幕高度;3) 获取控件高度;4) 使用GradientDrawable设置渐变颜色;5) 根据控件与屏幕高度比例动态调整颜色数量。示例代码展示了如何在滑动时根据比例改变背景颜色,实现流畅的视觉效果。
171 0
|
5月前
|
XML Android开发 数据格式
Android利用selector(选择器)实现图片动态点击效果
本文介绍了Android中ImageView的`src`与`background`属性的区别及应用,重点讲解如何通过设置背景选择器实现图片点击动态效果。`src`用于显示原图大小,不拉伸;`background`可随组件尺寸拉伸。通过创建`selector_setting.xml`,结合`setting_press.xml`和`setting_normal.xml`定义按下和正常状态的背景样式,提升用户体验。示例代码展示了具体实现步骤,包括XML配置和形状定义。
231 3
Android利用selector(选择器)实现图片动态点击效果
|
5月前
|
Java Android开发
Android图片的手动放大缩小
本文介绍了通过缩放因子实现图片放大缩小的功能,效果如动图所示。关键步骤包括:1) 在布局文件中设置 `android:scaleType=&quot;matrix&quot;`;2) 实例化控件并用 `ScaleGestureDetector` 处理缩放手势;3) 使用 `Matrix` 对图片进行缩放处理。为避免内存崩溃,可在全局配置添加 `android:largeHeap=&quot;true&quot;`。代码中定义了 `beforeScale` 和 `nowScale` 变量控制缩放范围,确保流畅体验。
165 8
|
5月前
|
缓存 编解码 Android开发
Android内存优化之图片优化
本文主要探讨Android开发中的图片优化问题,包括图片优化的重要性、OOM错误的成因及解决方法、Android支持的图片格式及其特点。同时介绍了图片储存优化的三种方式:尺寸优化、质量压缩和内存重用,并详细讲解了相关的实现方法与属性。此外,还分析了图片加载优化策略,如异步加载、缓存机制、懒加载等,并结合多级缓存流程提升性能。最后对比了几大主流图片加载框架(Universal ImageLoader、Picasso、Glide、Fresco)的特点与适用场景,重点推荐Fresco在处理大图、动图时的优异表现。这些内容为开发者提供了全面的图片优化解决方案。
181 1
|
5月前
|
Android开发 开发者
Android自定义view获取attr中自定义颜色的问题
本文针对Android自定义View在布局中设置颜色时遇到的问题进行分析与解决。问题表现为通过`getAttributeIntValue`方法获取颜色时,使用资源引用(如`@color/colorPrimary`)无法正确获取,而直接使用十六进制颜色值(如`#ff0000`)则正常。经过源码分析,发现是属性格式定义及获取方式不当导致。解决方案为将`attrs`文件中颜色属性的格式改为`reference|color`,并使用`TypedArray`的`getColor`方法获取颜色值,确保资源引用和直接颜色值均能正确解析。希望本文能帮助遇到类似问题的开发者。
|
Shell Android开发
Android中的获取内存信息的相关命令
相关命令: adb shell dumpsys meminfo > dumpsys_meminfo.txt adb shell cat /sys/kernel/debug/ion/ion_mm_heap > ion_mm_heap.
1231 0
|
14天前
|
开发工具 Android开发
X Android SDK file not found: adb.安卓开发常见问题-Android SDK 缺少 `adb`(Android Debug Bridge)-优雅草卓伊凡
X Android SDK file not found: adb.安卓开发常见问题-Android SDK 缺少 `adb`(Android Debug Bridge)-优雅草卓伊凡
182 11
X Android SDK file not found: adb.安卓开发常见问题-Android SDK 缺少 `adb`(Android Debug Bridge)-优雅草卓伊凡
|
24天前
|
Java 开发工具 Maven
【01】完整的安卓二次商业实战-详细的初级步骤同步项目和gradle配置以及开发思路-优雅草伊凡
【01】完整的安卓二次商业实战-详细的初级步骤同步项目和gradle配置以及开发思路-优雅草伊凡
89 6

热门文章

最新文章