`
abc20899
  • 浏览: 928967 次
  • 性别: Icon_minigender_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); 
    } 
 
分享到:
评论

相关推荐

    改变像素值

    "改变像素值"是图像处理中的基本操作,这涉及到对图像数据的直接操作,以实现各种效果或分析。下面将详细讨论如何通过OpenCV来实现这一功能。 首先,OpenCV中的`imread`函数用于读取图像,可以将图像文件加载到内存...

    Python之修改图片像素值的方法

    本文将详细介绍如何使用Python的PIL(Pillow)库来修改图片的像素值,特别地,我们将探讨如何将RGBA类型的图片转换为RGB类型。 首先,PIL库是Python中用于图像处理的基础库,它提供了丰富的功能,如打开、操作和...

    将图像的像素值更改为一圈8个像素点的平均值.rar

    在图像处理领域,有时我们需要对图像的像素值进行操作,以达到特定的视觉效果或算法需求。本项目涉及的主题是“将图像的像素值更改为一圈8个像素点的平均值”,这是一种平滑处理方法,通常用于降低图像的噪声或者...

    矩形任意框选图像改变图片像素灰度值

    这个场景在“矩形任意框选图像改变图片像素灰度值”项目中得到了体现。该项目采用Visual Studio 2010作为开发环境,并且自带了测试数据,能够实现用户通过矩形框选区域来调整图像的灰度值,提供了直观的图形处理效果...

    用c#实现图像处理:获取一幅图片的像素值及RGB分量

    本教程将深入探讨如何获取一幅图片的像素值及其RGB(红绿蓝)分量。首先,我们需要了解一些基本概念。 图像本质上是由像素组成的矩阵,每个像素都包含颜色信息,这些信息通常以RGB模式表示,即红色、绿色和蓝色的...

    提取图片的所有像素值并修改

    因此,通过改变这些像素值,我们可以对图像进行各种操作,如调整亮度、对比度、色彩等。 在LabVIEW中,处理图像通常涉及以下步骤: 1. **读取图像**:使用LabVIEW的Image Library或者第三方图像处理库,如NI ...

    qt Qimage动态更改图片像素例子

    QImage的像素数据存储为一个二维数组,可以通过`QImage::pixel()`和`QImage::setPixel()`方法读取和设置像素值。`QImage::pixel()`返回一个无符号的32位整数值,代表了像素的ARGB值,而`QImage::setPixel()`接受两个...

    hw1.zip_ARGUMENT!_lkd_图像处理_改变图片上半部分和下半部分像素值

    撰写一个程式由目录..\upload\ 中读取一张图像,将图像上半部分的每一个点像素的值加上一个整数值v,而图像下... 程式必须处理像素值溢位问题(overflow, underflow),确保像素 r, g, b 各值在 0 至 255 正确显示颜色。

    基于Android给图片添加水印,修改像素值代码

    像素值由红、绿、蓝(RGB)三个颜色通道组成,通过调整这三个通道的值,我们可以改变像素的颜色。 以下是实现这些功能的基本步骤: 1. **加载图片**:使用BitmapFactory.decodeResource()或decodeFile()方法加载...

    c# 取图片像素的RGB

    在C#编程中,获取图片像素的RGB值是一项基本任务,尤其在图像处理和分析的场景中非常常见。RGB代表红色(Red)、绿色(Green)和蓝色(Blue),是计算机屏幕上显示颜色的一种方式。每种颜色都有一个0到255的强度值,...

    安卓Gallery照片墙画廊图库相关-相机首先保存到了指定目录后用Glide加载原图。然后在用框架压缩图片大小为100KB左右。图片像素值基本没什么改变.rar

    相机首先保存到了指定目录后,用Glide加载原图。然后在用框架压缩图片大小为:100KB左右。图片像素值基本没什么改变.rar,太多无法一一验证是否可用,程序如果跑不起来需要自调,部分代码功能进行参考学习。

    js改变图片亮度..

    在JavaScript中,改变图片的亮度和饱和度是通过图像处理技术实现的,这涉及到像素级别的操作。主要使用到HTML5的Canvas API,因为Canvas提供了一种动态处理图像的方法。接下来,我们将深入探讨如何使用JavaScript来...

    调整图片像素大小

    在图像处理领域,调整图片像素大小是一项常见的任务,尤其在网页设计、印刷、社交媒体分享等场景中,适配不同平台的尺寸要求至关重要。本话题主要围绕如何改变png、icon和jpg格式图片的像素大小,以及如何使用名为...

    Python+OpenCV图片局部区域像素值处理详解

    在本文中,我们将深入探讨如何使用Python和OpenCV库来处理图像的局部区域像素值。...例如,你可以修改代码以适应不同的像素处理需求,如改变ROI大小、调整像素值的处理方式,或者使用更复杂的统计分析方法。

    DELPHI --学习 通过改变通道来改变图片

    在DELPHI编程环境中,通过改变通道来改变图片是一种常见的图像处理技术,它涉及到像素级别的操作,能够实现各种效果,如色彩调整、灰度转换、透明度修改等。本教程将深入探讨如何在DELPHI中实现这一功能。 首先,...

    改变图片亮度的源码

    接下来,我们需要实现一个函数,遍历图像中的每一个像素,应用上述公式,并更新像素值。以下是一个基于Python的PIL库(Python Imaging Library)的示例代码: ```python from PIL import Image def adjust_...

    图片像素缩放--支持多张图片

    插值缩放通过在原始像素之间插入新计算的颜色值来增加或减少图像的像素数,以改变大小。不失真缩放则保持图像的原始比例,避免拉伸或压缩导致的变形。本软件很可能是采用这两种方法中的一种或结合两者,来确保在调整...

    phototoys改变图片大小

    1. **理解像素与分辨率**:图片大小通常由宽度和高度的像素值表示,例如640x480像素。像素是构成数字图像的基本单元,每个像素包含颜色信息。分辨率则指每英寸内像素的数量,通常以PPI(Pixels Per Inch)表示,它...

    怎么改变图片大小,改变图片大小的5种方法.docx

    值得注意的是,改变图片大小可能会影响其质量,特别是大幅度缩小可能导致像素化,因此在调整时应尽量保持合适的分辨率。同时,不同的输出目的(如打印或网络发布)可能对图片尺寸有特定要求,需提前了解并据此调整。

Global site tag (gtag.js) - Google Analytics