- 浏览: 928967 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
itzhongyuan:
java Random类详解 -
david_je:
你好,我看到你在C里面回调JAVA里面的方法是在native里 ...
Android NDK开发(1)----- Java与C互相调用实例详解 -
fykyx521:
请求锁是在 oncreate 释放实在ondestroy?? ...
Android如何保持程序一直运行 -
aduo_vip:
不错,总结得好!
Android读取assets目录下的资源 -
f839903061:
给的网址很给力哦!
Android 4.0.1 源码下载,编译和运行
要想修改Bitmap图片的 R G B信息 首先 得先拿到这张图片每个点的Color值 然后根据这个Color值 就可以算出对应的R G B 值 我们都知道在计算机语言中在内存中加载一张图片实际上是把图片的每个点的RGB信息写入内存 如果动态的修改了这些颜色信息 那绘制出来的图片就会改变。
修改图片的颜色值其实在很多地方都有用处,我记得以前我做J2ME游戏开发的时候 因为手机本身内存比较低 不能同时在内存中加载过多的图片 比如 在打怪的时候 玩家肯定不希望每次看到的怪物都一样 在不加大内存的情况下可以选择修改图片的R G B信息 就会给玩家耳目一新的感觉 这就是游戏调色板的原理。
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 绘制 图片
view plain
<?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
view plain
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);
}
}
修改图片的颜色值其实在很多地方都有用处,我记得以前我做J2ME游戏开发的时候 因为手机本身内存比较低 不能同时在内存中加载过多的图片 比如 在打怪的时候 玩家肯定不希望每次看到的怪物都一样 在不加大内存的情况下可以选择修改图片的R G B信息 就会给玩家耳目一新的感觉 这就是游戏调色板的原理。
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 绘制 图片
view plain
<?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
view plain
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);
}
}
发表评论
-
Android使用binder访问service的方式
2013-08-23 09:42 16301. 我们先来看一个与本地service通信的例子。 pub ... -
android-Service和Thread的区别
2013-08-23 09:17 914servie是系统的组件,它由系统进程托管(servicema ... -
git介绍
2013-08-01 14:49 1033git介绍 使用Git的第一件事就是设置你的名字和email ... -
cocos2d-x学习之自动内存管理和常见宏
2013-07-29 15:41 9081.自动内存管理 1)概述 C++语言默认是 ... -
cocos2dx中利用xcode 调用java中的函数
2013-07-29 11:36 25241. 先把cocos2dx根目录中的 /Users/zhaos ... -
cocos2dx(v2.x)与(v1.x)的一些常用函数区别讲解
2013-07-29 10:35 1109第一个改动: CCLayer初始化 自定义Layer,类名 ... -
xcode与eclipse整合cocos2dx
2013-07-29 10:32 1220文档xcode版本是 204 1. 在xcode中创建coc ... -
git提交代码
2013-07-23 16:00 10531. 在本地创建一个Git的工作空间,在里面创建一个工程(如H ... -
Android.mk的用法和基础
2013-07-19 14:11 4332一个Android.mk file用来向编译系统描述你的源代码 ... -
eclipse配置NDK-Builder命令
2013-07-18 11:02 10351. 2. -
eclipse配置javah命令
2013-07-18 10:48 19931.找到javah命令所在的目录 我的为 /usr/bi ... -
Android SDL2.0 编译
2013-07-17 13:40 19671,下载: wget http://www.libsdl.o ... -
IntelliJ Idea 常用快捷键列表
2013-05-27 10:19 0Alt+回车 导入包,自动修 ... -
android应用后台安装
2013-05-21 12:02 1015android应用后台安装,静默安装的代码实现方法 http ... -
编译linux内核映像
2013-05-21 11:33 962a)准备交叉编译工具链 android代码树中有一个pr ... -
如何单独编译Android源代码中的模块
2013-05-21 11:29 994一. 首先在Android源代码 ... -
Ubuntu安装JDK6和JDK5
2013-05-19 19:04 1006sudo apt-get install sun-java6- ... -
java_jni详解_01
2013-05-08 17:15 956java中的jni 例子HelloWorld 准备过程: 1 ... -
下载android源码 中断解决原因
2013-05-07 15:51 1315解决方法 1. 浏览器登录https://android.go ... -
mac下编译ffmpeg1.1.4
2013-05-07 14:55 1364经过一番网上搜索 与 无数次的编译 终于成功了 下面献上编译 ...
相关推荐
"改变像素值"是图像处理中的基本操作,这涉及到对图像数据的直接操作,以实现各种效果或分析。下面将详细讨论如何通过OpenCV来实现这一功能。 首先,OpenCV中的`imread`函数用于读取图像,可以将图像文件加载到内存...
本文将详细介绍如何使用Python的PIL(Pillow)库来修改图片的像素值,特别地,我们将探讨如何将RGBA类型的图片转换为RGB类型。 首先,PIL库是Python中用于图像处理的基础库,它提供了丰富的功能,如打开、操作和...
在图像处理领域,有时我们需要对图像的像素值进行操作,以达到特定的视觉效果或算法需求。本项目涉及的主题是“将图像的像素值更改为一圈8个像素点的平均值”,这是一种平滑处理方法,通常用于降低图像的噪声或者...
这个场景在“矩形任意框选图像改变图片像素灰度值”项目中得到了体现。该项目采用Visual Studio 2010作为开发环境,并且自带了测试数据,能够实现用户通过矩形框选区域来调整图像的灰度值,提供了直观的图形处理效果...
本教程将深入探讨如何获取一幅图片的像素值及其RGB(红绿蓝)分量。首先,我们需要了解一些基本概念。 图像本质上是由像素组成的矩阵,每个像素都包含颜色信息,这些信息通常以RGB模式表示,即红色、绿色和蓝色的...
因此,通过改变这些像素值,我们可以对图像进行各种操作,如调整亮度、对比度、色彩等。 在LabVIEW中,处理图像通常涉及以下步骤: 1. **读取图像**:使用LabVIEW的Image Library或者第三方图像处理库,如NI ...
QImage的像素数据存储为一个二维数组,可以通过`QImage::pixel()`和`QImage::setPixel()`方法读取和设置像素值。`QImage::pixel()`返回一个无符号的32位整数值,代表了像素的ARGB值,而`QImage::setPixel()`接受两个...
撰写一个程式由目录..\upload\ 中读取一张图像,将图像上半部分的每一个点像素的值加上一个整数值v,而图像下... 程式必须处理像素值溢位问题(overflow, underflow),确保像素 r, g, b 各值在 0 至 255 正确显示颜色。
像素值由红、绿、蓝(RGB)三个颜色通道组成,通过调整这三个通道的值,我们可以改变像素的颜色。 以下是实现这些功能的基本步骤: 1. **加载图片**:使用BitmapFactory.decodeResource()或decodeFile()方法加载...
在C#编程中,获取图片像素的RGB值是一项基本任务,尤其在图像处理和分析的场景中非常常见。RGB代表红色(Red)、绿色(Green)和蓝色(Blue),是计算机屏幕上显示颜色的一种方式。每种颜色都有一个0到255的强度值,...
相机首先保存到了指定目录后,用Glide加载原图。然后在用框架压缩图片大小为:100KB左右。图片像素值基本没什么改变.rar,太多无法一一验证是否可用,程序如果跑不起来需要自调,部分代码功能进行参考学习。
在JavaScript中,改变图片的亮度和饱和度是通过图像处理技术实现的,这涉及到像素级别的操作。主要使用到HTML5的Canvas API,因为Canvas提供了一种动态处理图像的方法。接下来,我们将深入探讨如何使用JavaScript来...
在图像处理领域,调整图片像素大小是一项常见的任务,尤其在网页设计、印刷、社交媒体分享等场景中,适配不同平台的尺寸要求至关重要。本话题主要围绕如何改变png、icon和jpg格式图片的像素大小,以及如何使用名为...
在本文中,我们将深入探讨如何使用Python和OpenCV库来处理图像的局部区域像素值。...例如,你可以修改代码以适应不同的像素处理需求,如改变ROI大小、调整像素值的处理方式,或者使用更复杂的统计分析方法。
在DELPHI编程环境中,通过改变通道来改变图片是一种常见的图像处理技术,它涉及到像素级别的操作,能够实现各种效果,如色彩调整、灰度转换、透明度修改等。本教程将深入探讨如何在DELPHI中实现这一功能。 首先,...
接下来,我们需要实现一个函数,遍历图像中的每一个像素,应用上述公式,并更新像素值。以下是一个基于Python的PIL库(Python Imaging Library)的示例代码: ```python from PIL import Image def adjust_...
插值缩放通过在原始像素之间插入新计算的颜色值来增加或减少图像的像素数,以改变大小。不失真缩放则保持图像的原始比例,避免拉伸或压缩导致的变形。本软件很可能是采用这两种方法中的一种或结合两者,来确保在调整...
1. **理解像素与分辨率**:图片大小通常由宽度和高度的像素值表示,例如640x480像素。像素是构成数字图像的基本单元,每个像素包含颜色信息。分辨率则指每英寸内像素的数量,通常以PPI(Pixels Per Inch)表示,它...
值得注意的是,改变图片大小可能会影响其质量,特别是大幅度缩小可能导致像素化,因此在调整时应尽量保持合适的分辨率。同时,不同的输出目的(如打印或网络发布)可能对图片尺寸有特定要求,需提前了解并据此调整。