精华内容
下载资源
问答
  • getPixels

    2011-12-08 14:01:44
    public void getPixels (int[] pixels, int offset, int stride, int x, int y, int width, int height) Since: API Level 1 Returns in pixels[] a copy of the data in the bitmap. Each value is a ....

    public void getPixels (int[] pixels, int offset, int stride, int x, int y, int width, int height)

    Since: API Level 1

    Returns in pixels[] a copy of the data in the bitmap. Each value is a packed int representing a Color. The stride parameter allows the caller to allow for gaps in the returned pixels array between rows. For normal packed results, just pass width for the stride value.

    Parameters
    pixels The array to receive the bitmap's colors
    offset The first index to write into pixels[]
    stride The number of entries in pixels[] to skip between rows (must be >= bitmap's width). Can be negative.
    x The x coordinate of the first pixel to read from the bitmap
    y The y coordinate of the first pixel to read from the bitmap
    width The number of pixels to read from each row
    height

    The number of rows to read

     

     
    IllegalArgumentException    if x, y, width, height exceed the bounds of the bitmap, or if abs(stride) <  width ArrayIndexOutOfBoundsException   if the pixels array is too small to receive the specified number of pixels IllegalArgumentException if x, y, width, height exceed the bounds of the bitmap, or if abs(stride) < width. ArrayIndexOutOfBoundsException

     

     

     
    例:
          mBarPixels = new int[mWidth * mHeight];
         mBarBitmap.getPixels(mBarPixels, 0, mWidth, i, 0, mWidth, mHeight);
    //从(i,0)点 开始截取像素,放入 mBarPixels 数组中。
          canvas.drawBitmap(mBarPixels, 0, mWidth, 0, 0, mWidth, mHeight, true, null);
    //使用像素

    public void drawBitmap (int[] colors, int offset, int stride, float x, float y, int width, int height, boolean hasAlpha, Paint paint)

    colors Array of colors representing the pixels of the bitmap
    offset Offset into the array of colors for the first pixel
    stride The number of colors in the array between rows (must be >= width or <= -width).
    x The X coordinate for where to draw the bitmap
    y The Y coordinate for where to draw the bitmap
    width The width of the bitmap
    height The height of the bitmap
    hasAlpha True if the alpha channel of the colors contains valid values. If false, the alpha byte is ignored (assumed to be 0xFF for every pixel).
    paint May be null. The paint used to draw the bitmap
     
    展开全文
  • Bitmap类getPixels()详解

    万次阅读 2016-08-18 19:02:45
    getPixels()void getPixels (int[] pixels, int offset, int stride, int x, int y, int width, int heigh

    转载请标明出处:http://blog.csdn.net/xx326664162/article/details/52240795 文章出自:薛瑄的博客

    你也可以查看我的其他同类文章,也会让你有一定的收货

    getPixels()

    void getPixels (int[] pixels, 
                    int offset, 
                    int stride, 
                    int x, 
                    int y, 
                    int width, 
                    int height)
    

    Returns in pixels[] a copy of the data in the bitmap. Each value is a packed int representing a Color. The stride parameter allows the caller to allow for gaps in the returned pixels array between rows. For normal packed results, just pass width for the stride value. The returned colors are non-premultiplied ARGB values.

    Parameters

    参数名
    pixels int: The array to receive the bitmap’s colors
    offset int: The first index to write into pixels[]
    stride int: The number of entries in pixels[] to skip between rows (must be >= bitmap’s width). Can be negative.
    x int: The x coordinate of the first pixel to read from the bitmap
    y int: The y coordinate of the first pixel to read from the bitmap
    width int: The number of pixels to read from each row
    height int: The number of rows to read

    getPixels()函数把一张图片,从指定的偏移位置(offset),指定的位置(x,y)截取指定的宽高(width,height ),把所得图像的每个像素颜色转为int值,存入pixels。

    stride 参数指定在行之间跳过的像素的数目。图片是二维的,存入一个一维数组中,那么就需要这个参数来指定多少个像素换一行。

    可能有的人有疑问了,直接使用参数中的width,不就可以了,干嘛还要stride参数???

    下面来看看stride参数的两种用处,这个问题你就会明白

    stride参数两种用处

    第一种:

    可以截取图片中部分区域或者图片拼接.

    1.1、截图:

    假设读取像素值的原图片宽为w,高为h,此时设置参数pixels[w* h], 参数stride为 w ,参数offset为0,参数x ,y为截图的起点位置,参数width和height为截图的宽度和高度,

    则此方法运行后,返回的pixels[]数组中从pixels[0]至pixels[width*height-1]里存储的是从图片( x , y )处起读取的截图大小为width * height的像素值.

    示例:修改Android SDK自带的AipDemo程序中BitmapDecode示例,更换图像为自制四角四色图:

    这里写图片描述

    图像大小为100*100,想截取图片右上1/4图像(图上黄色部分)修改程序部分代码为:

    //截取图片
    mBitmap2.getPixels(pixels, 0, w, 50, 0, w/2, h/2);  
    
    mBitmap3 = Bitmap.createBitmap(pixels, 0, w, w, h,  
                                               Bitmap.Config.ARGB_8888);  
    mBitmap4 = Bitmap.createBitmap(pixels, 0, w, w, h,  
                                               Bitmap.Config.ARGB_4444);
    

    这里写图片描述

    • 生成的图片尺寸大小是由Bitmap.createBitmap()中的第4、5个参数决定的。

    1.2、改变offset

    下面设置下getPixels()方法中offset,使得黄色部分截图出现在它在原图中的位置, offset = x + y*w ,本例代码如下:

    显示在右上角

    offset = 50 + 0* 100

    mBitmap2.getPixels(pixels, 50, w, 50, 0, w/2, h/2); 
    

    这里写图片描述

    显示在右下角

    offset = 50 + 50* 100

    mBitmap2.getPixels(pixels, 5050, w, 50, 0, w/2, h/2); 
    

    这里写图片描述

    getPixels()是把二维的图片的每一行像素颜色值读取到一个一维数组中
    offset指明了所截取的图片的第一个像素的起始位置,如果显示在右下角,起始坐标是(50,50),这个点就是第50行,再移动50个像素,每行100个像素,所以在一维数组中的位置就是50+50*100

    1.3、改变stride

    先给出stride的结论,

    • 在原图上截取的时候,需要读取stride个像素再去读原图的下一行
    • 如果一行的像素个数足够,就读取stride个像素再下一行读
    • 如果一行的像素个数不够,用0(透明)来填充到 stride个
    • 得到的数据,依次存入pixels[]这个一维数组中

    stride 设置为宽度的1/2

    mBitmap2.getPixels(pixels, 0, w/2, 50, 0, w/2, h/2); 
    

    这里写图片描述

    stride 设为宽度的一半,上面的代码在截取原图的时候就是从(50,0)的位置读取一半然后换行,一直这样,直到读取够指定的宽高(w/2, h/2),把这些数据存储到pixels[]中,所以在pixels[]的前2500个整数存储的是黄色区块的信息。

    stride 设置为宽度的2倍

    mBitmap2.getPixels(pixels, 0, w/2, 50, 0, w/2, h/2); 
    

    这里写图片描述

    stride 设为宽度的2倍,上面的代码在截取原图的时候就是从(50,0)的位置读取2w个像素然后换行,但是指定读取的宽度为w/2,所以剩下的w3/2个值用0填充。一直这样,直到读取够指定的宽高(w/2, h/2),把这些数据存储到pixels[]中,所以在pixels[]中存储的是{ w/2个黄色区块信息,w3/2个透明值 ,w/2个黄色区块信息,w3/2个透明值 ,…}

    所以看到左边的黄色,感觉颜色变淡了,就是因为有透明颜色参杂进来

    stride 设置为宽度的3/2倍

    mBitmap2.getPixels(pixels, 0, w*3/2, 50, 0, w/2, h/2); 
    

    这里写图片描述

    这个和上面的解释一样,下面来张大图,让你更好观察

    这里写图片描述

    stride 设置为宽度的3/2倍,起始位置为(0,0)

    参数stride和width到底有什么区别,看完下面这个例子,相信你会恍然大悟

    截取的是原图左上角部分,stride = w*3/2;

    mBitmap2.getPixels(pixels, 0, w*3/2, 0, 0, w/2, h/2); 
    

    这里写图片描述

    另,pixels.length >= stride * height,否则会抛出ArrayIndexOutOfBoundsException 异常

    2: 图片拼接

    假设两张图片大小都为 w * h ,getPixels()方法中设置参数pixels[2wh],参数offset = 0,stride = 2w读取第一张图片,再次运行getPixels()方法,设置参数offset = w,stride = 2w,读取第二张图片,再将pixels[]绘制到画布上就可以看到两张图片已经拼接起来了.

    int w = mBitmap2.getWidth();  
                int h = mBitmap2.getHeight();  
                int n = 2*w;  
                Log.i(SampleView.VIEW_LOG_TAG,String.valueOf(w*h));  
                int[] pixels = new int[n*h];  
                for(int i=0; i < n*h; i++){  
                    pixels[i] = -2578654;  
                }  
                mBitmap2.getPixels(pixels, 0, n, 0, 0, w, h);  
                mBitmap2.getPixels(pixels, w, n, 0, 0, w, h);  
                mBitmap3 = Bitmap.createBitmap(pixels, 0, n, n, h,  
                                               Bitmap.Config.ARGB_8888); 
    

    运行结果如下 :

    这里写图片描述

    第二种:

    stride表示数组pixels[]中存储的图片每行的数据,在其中可以附加信息,即
    stride = width + padding,如下图所示

    这里写图片描述

    这样可以不仅仅存储图片的像素信息,也可以储存相应每行的其它附加信息.

    • stride > width时,可以在pixels[]数组中添加每行的附加信息,可做它用.在使用Bitmap.createBitmap()创建新图时,需要考虑新图尺寸的大小

    参考:
    http://ranlic.iteye.com/blog/1313735 这篇博客中,作者似乎没有stride 的真正含义,在最后的结论一中,“用来表示pixels[]数组中每行的像素个数,用于行与行之间区分”,这句话理解是错误的。
    [getPixels()官方文档](https://developer.android.com/reference/android/graphics/Bitmap.html#getPixels(int[], int, int, int, int, int, int))

    关注我的公众号,轻松了解和学习更多技术
    这里写图片描述

    展开全文
  • Bitmap类getPixels 详解

    2019-01-11 18:20:01
    Bitmap类getPixels 详解
                         

    转载请标明出处:http://blog.csdn.net/xx326664162/article/details/52240795  文章出自:薛瑄的博客

    你也可以查看我的其他同类文章,也会让你有一定的收货

    getPixels()

    void getPixels (int[] pixels,                 int offset,                 int stride,                 int x,                 int y,                 int width,                 int height)
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    Returns in pixels[] a copy of the data in the bitmap. Each value is a packed int representing a Color. The stride parameter allows the caller to allow for gaps in the returned pixels array between rows. For normal packed results, just pass width for the stride value. The returned colors are non-premultiplied ARGB values.

    Parameters

                                   
    参数名
    pixelsint: The array to receive the bitmap’s colors
    offsetint: The first index to write into pixels[]
    strideint: The number of entries in pixels[] to skip between rows (must be >= bitmap’s width). Can be negative.
    xint: The x coordinate of the first pixel to read from the bitmap
    yint: The y coordinate of the first pixel to read from the bitmap
    widthint: The number of pixels to read from each row
    heightint: The number of rows to read

    getPixels()函数把一张图片,从指定的偏移位置(offset),指定的位置(x,y)截取指定的宽高(width,height  ),把所得图像的每个像素颜色转为int值,存入pixels。

    stride  参数指定在行之间跳过的像素的数目。图片是二维的,存入一个一维数组中,那么就需要这个参数来指定多少个像素换一行。

    可能有的人有疑问了,直接使用参数中的width,不就可以了,干嘛还要stride参数???

    下面来看看stride参数的两种用处,这个问题你就会明白

    stride参数两种用处

    第一种:

    可以截取图片中部分区域或者图片拼接.

    1.1、截图:

    假设读取像素值的原图片宽为w,高为h,此时设置参数pixels[w* h], 参数stride为 w ,参数offset为0,参数x ,y为截图的起点位置,参数width和height为截图的宽度和高度,

    则此方法运行后,返回的pixels[]数组中从pixels[0]至pixels[width*height-1]里存储的是从图片( x , y )处起读取的截图大小为width * height的像素值.

    示例:修改Android SDK自带的AipDemo程序中BitmapDecode示例,更换图像为自制四角四色图:

    这里写图片描述

    图像大小为100*100,想截取图片右上1/4图像(图上黄色部分)修改程序部分代码为:

    //截取图片mBitmap2.getPixels(pixels, 0, w, 50, 0, w/2, h/2)mBitmap3 = Bitmap.createBitmap(pixels, 0, w, w, h,                                             Bitmap.Config.ARGB_8888)mBitmap4 = Bitmap.createBitmap(pixels, 0, w, w, h,                                             Bitmap.Config.ARGB_4444);
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    这里写图片描述

    • 生成的图片尺寸大小是由Bitmap.createBitmap()中的第4、5个参数决定的。

    1.2、改变offset

    下面设置下getPixels()方法中offset,使得黄色部分截图出现在它在原图中的位置, offset = x + y*w ,本例代码如下:

    显示在右上角

    offset  = 50 + 0* 100

    mBitmap2.getPixels(pixels, 50, w, 50, 0, w/2, h/2); 
    • 1

    这里写图片描述

    显示在右下角

    offset  = 50 + 50* 100

    mBitmap2.getPixels(pixels, 5050, w, 50, 0, w/2, h/2); 
    • 1

    这里写图片描述

    getPixels()是把二维的图片的每一行像素颜色值读取到一个一维数组中
    offset指明了所截取的图片的第一个像素的起始位置,如果显示在右下角,起始坐标是(50,50),这个点就是第50行,再移动50个像素,每行100个像素,所以在一维数组中的位置就是50+50*100

    1.3、改变stride

    先给出stride的结论,

    • 在原图上截取的时候,需要读取stride个像素再去读原图的下一行
    • 如果一行的像素个数足够,就读取stride个像素再下一行读
    • 如果一行的像素个数不够,用0(透明)来填充到 stride个
    • 得到的数据,依次存入pixels[]这个一维数组中

    stride 设置为宽度的1/2

    mBitmap2.getPixels(pixels, 0, w/2, 50, 0, w/2, h/2); 
    • 1

    这里写图片描述

    stride 设为宽度的一半,上面的代码在截取原图的时候就是从(50,0)的位置读取一半然后换行,一直这样,直到读取够指定的宽高(w/2, h/2),把这些数据存储到pixels[]中,所以在pixels[]的前2500个整数存储的是黄色区块的信息。

    stride 设置为宽度的2倍

    mBitmap2.getPixels(pixels, 0, w/2, 50, 0, w/2, h/2); 
    • 1

    这里写图片描述

    stride 设为宽度的2倍,上面的代码在截取原图的时候就是从(50,0)的位置读取2w个像素然后换行,但是指定读取的宽度为w/2,所以剩下的w3/2个值用0填充。一直这样,直到读取够指定的宽高(w/2, h/2),把这些数据存储到pixels[]中,所以在pixels[]中存储的是{ w/2个黄色区块信息,w3/2个透明值 ,w/2个黄色区块信息,w3/2个透明值 ,……..}

    所以看到左边的黄色,感觉颜色变淡了,就是因为有透明颜色参杂进来

    stride 设置为宽度的3/2倍

    mBitmap2.getPixels(pixels, 0, w*3/2, 50, 0, w/2, h/2); 
    • 1

    这里写图片描述

    这个和上面的解释一样,下面来张大图,让你更好观察

    这里写图片描述

    stride 设置为宽度的3/2倍,起始位置为(0,0)

    参数stride和width到底有什么区别,看完下面这个例子,相信你会恍然大悟

    截取的是原图左上角部分,stride = w*3/2;

    mBitmap2.getPixels(pixels, 0, w*3/2, 0, 0, w/2, h/2); 
    • 1

    这里写图片描述

    另,pixels.length >= stride * height,否则会抛出ArrayIndexOutOfBoundsException 异常

    2: 图片拼接

    假设两张图片大小都为 w * h ,getPixels()方法中设置参数pixels[2*w*h],参数offset = 0,stride = 2*w读取第一张图片,再次运行getPixels()方法,设置参数offset = w,stride = 2*w,读取第二张图片,再将pixels[]绘制到画布上就可以看到两张图片已经拼接起来了.

    int w = mBitmap2.getWidth();              int h = mBitmap2.getHeight();              int n = 2*w;              Log.i(SampleView.VIEW_LOG_TAG,String.valueOf(w*h));              int[] pixels = new int[n*h];              for(int i=0; i < n*h; i++){                  pixels[i] = -2578654;              }              mBitmap2.getPixels(pixels, 0, n, 0, 0, w, h);              mBitmap2.getPixels(pixels, w, n, 0, 0, w, h);              mBitmap3 = Bitmap.createBitmap(pixels, 0, n, n, h,                                             Bitmap.Config.ARGB_8888); 
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    运行结果如下 :

    这里写图片描述

    第二种: 

    stride表示数组pixels[]中存储的图片每行的数据,在其中可以附加信息,即 
    stride = width + padding,如下图所示

    这里写图片描述

    这样可以不仅仅存储图片的像素信息,也可以储存相应每行的其它附加信息.

    • stride > width时,可以在pixels[]数组中添加每行的附加信息,可做它用.在使用Bitmap.createBitmap()创建新图时,需要考虑新图尺寸的大小

    参考:
    http://ranlic.iteye.com/blog/1313735  这篇博客中,作者似乎没有stride 的真正含义,在最后的结论一中,“用来表示pixels[]数组中每行的像素个数,用于行与行之间区分”,这句话理解是错误的。
    getPixels()官方文档

     

    关注我的公众号,轻松了解和学习更多技术
      这里写图片描述

               

    再分享一下我老师大神的人工智能教程吧。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.csdn.net/jiangjunshow

    展开全文
  • Android Bitmap.getPixels的正确理解演示源码,参考文章《Android Bitmap入门:getPixels的正确理解》
  • Bitmap 之 getPixels 的 stride

    分享一下我老师大神的人工智能教程。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.csdn.net/jiangjunshow

                   

    学习Graphics中遇到位图(Bitmap)中getPixels()方法,对该方法的用法大体理解,但对其中的stride参数却不明白具体的用法以及用意,现记述过程如下:

    getPixels()方法的用处为获取位图(Bitmap)中的像素值(颜色值),存入类型为int的pixels数组中,至于从RGB转换为int数值的算法是什么,暂时不知,存疑!! 

    Android英文SDK中有关getPixels()方法的介绍如下

    

    public void getPixels (int[] pixels, int offset, int stride, int x, int y, int width, int height)

    Since: API Level 1

    Returns in pixels[] a copy of the data in the bitmap. Each value is a packed int representing a Color. The stride parameter allows the caller to allow for gaps in the returned pixels array between rows. For normal packed results, just pass width for the stride value.

    Parameters
    pixelsThe array to receive the bitmap's colors
    offsetThe first index to write into pixels[]
    strideThe number of entries in pixels[] to skip between rows (must be >= bitmap's width). Can be negative.
    xThe x coordinate of the first pixel to read from the bitmap
    yThe y coordinate of the first pixel to read from the bitmap
    widthThe number of pixels to read from each row
    heightThe number of rows to read
    Throws
    IllegalArgumentExceptionif x, y, width, height exceed the bounds of the bitmap, or if abs(stride) < width.
    ArrayIndexOutOfBoundsExceptionif the pixels array is too small to receive the specified number of pixels. 


    看完英文文档仍然不甚明白,于是去搜了下中文Android文档相应内容, getPixels()

    public void getPixels (int[] pixels, int offset, int stride, int x, int y, int width, int height) 

    把位图的数据拷贝到pixels[]中。每一个都由一个表示颜色值的int值来表示。幅度参数(stride)表明调用者允许的像素数组行间距。对通常的填充结果,只要传递宽度值给幅度参数。

    参数

    pixels       接收位图颜色值的数组

    offset      写入到pixels[]中的第一个像素索引值

    stride       pixels[]中的行间距个数值(必须大于等于位图宽度)。可以为负数

    x             从位图中读取的第一个像素的x坐标值。

                     y             从位图中读取的第一个像素的y坐标值

                     width       从每一行中读取的像素宽度

                     height   读取的行数               

      异常

                       IllegalArgumentExcepiton                 如果xywidthheight越界或stride的绝对值小于位图宽度时将被抛出。

                       ArrayIndexOutOfBoundsException          如果像素数组太小而无法接收指定书目的像素值时将被抛出。


    看完后仍然对Stride解释中的"行间距"不太明白,去查了下Stride在英语中的原义,Stride在柯林斯中的英英释义如下

    1 If you stride somewhere, you walk there with quick, long steps.
      stride意为"大踏步快速前进"
    2 A stride is a long step which you take when you are walking or running.
      stride在此做名词,意为"大步"
    3 Someone's stride is their way of walking with long steps.
      指代某人具体迈大步的方式.

    于是可以把stride理解为人行走过程中所迈大步的一段距离,而在此方法中可以理解为每行的像素数,至于用处是什么,还要继续寻找答案.

    然后去StackOverFlow去搜了搜"getPixels() stride"关键字,查找到如下信息

    1  In most cases the stride is the same as the width. The stride is useful if you are trying to copy/draw a sub-region of a Bitmap. For instance, if you have a 100x100 bitmap and you want to draw the 50x50 top-right corner, you can use a width of 50px and a stride of 100px.(注:stride绝对值要大于等于位图的宽度)

    2  Stride is number of bytes used for storing one image row.

    Stride can be different from the image width. 

    Most of the images are 4 byte aligned.

    For ex. a 24 bit (RGB) image with width of 50 pixels. The total bytes required will be 150 (3(RGB)*50). As image will be 4 byte aligned, in this case the byte required will become 154. 
    So you will see stride as 154, width 50 and image alignment as 4 byte.

    上面内容表示stride参数有两种用处

    第一种

    可以截取图片中部分区域或者图片拼接.

    截图:假设读取像素值的原图片宽为w,高为h,此时设置参数pixels[w*h], 参数stride为 w ,参数offset为0,参数x ,y为截图的起点位置,参数width和height为截图的宽度和高度,则此方法运行后,返回的pixels[]数组中从pixels[0]至pixels[width*height-1]里存储的是从图片( x , y )处起读取的截图大小为width * height的像素值.
    示例:修改Android SDK自带的AipDemo程序中BitmapDecode示例,更换图像为自制四角四色图:


    图像大小为100*100,想截取图片右上1/4图像(图上黄色部分)修改程序部分代码为: 

     int[] pixels = new int[w*h]; mBitmap2.getPixels(pixels, 0, w, 50, 0, w/2, h/2); mBitmap3 = Bitmap.createBitmap(pixels, 0, w, w, h, Bitmap.Config.ARGB_8888); mBitmap4 = Bitmap.createBitmap(pixels, 0, w, w, h, Bitmap.Config.ARGB_4444); String txt = String.valueOf(pixels[10]); Log.i("myBitmapDecode", "w = " + w + "; h = " + h); Log.i("myBitmapDecode", "pixels[0] = " + pixels[0] + "; pixels[1] = " + pixels[1] + "; pixels[10] = " + pixels[10]); Log.i("myBitmapDecode", "pixels[w] = " + pixels[w] + "; pixels[h] = " + pixels[h] + "; pixels[w*h-1] = " + pixels[w*h-1]);

    运行结果:

    I/myBitmapDecode(  660): w = 100; h = 100
    I/myBitmapDecode(  660): pixels[0]-16777216; pixels[1] = -16777216;
    pixels[10] = -4352
    I/myBitmapDecode(  660): pixels[w]-16777216; pixels[h] = -16777216; pixels[w*h-1] = 0

    我们看到右边两副ARGB_8888,ARGB_4444图像隐约只在左上角显示原图右上的1/4黄色部分,其余部分为背景色白色,那么问题又来了,此时ARGB_8888,ARGB_4444图像大小为多少?还是原图的大小(100*100)吗,或者是(50*50)了,不然背景色为何是画布的背景色呢(白色)?那么把 pixels[100*100]数组设初始值看下情况(通过Log.i()我查到了pixels中存储的像素值为百万左右的负整数(-16777216),所以这里胡乱取个数-2578654做为初始值,颜色不太好,请见谅),修改后代码如下: 

     int[] pixels = new int[w*h]; for(int i=0; i<w*h; i++){  pixels[i] = -2578654;  } mBitmap2.getPixels(pixels, 0, w, 50, 0, w/2, h/2); mBitmap3 = Bitmap.createBitmap(pixels, 0, w, w, h, Bitmap.Config.ARGB_8888); mBitmap4 = Bitmap.createBitmap(pixels, 0, w, w, h, Bitmap.Config.ARGB_4444); String txt = String.valueOf(pixels[10]); Log.i("myBitmapDecode", "w = " + w + "; h = " + h); Log.i("myBitmapDecode", "pixels[0] = " + pixels[0] + "; pixels[1] = " + pixels[1] + "; pixels[10] = " + pixels[10]); Log.i("myBitmapDecode", "pixels[w] = " + pixels[w] + "; pixels[h] = " + pixels[h] + "; pixels[w*h-1] = " + pixels[w*h-1]);

    运行结果:


    I/myBitmapDecode(  727): w = 100; h = 100
    I/myBitmapDecode(  727): pixels[0] = -16777216; pixels[1] = -16777216;
    pixels[10] = -4352
    I/myBitmapDecode(  727): pixels[w] = -16777216; pixels[h] = -16777216; pixels[w*h-1] = -2578654

    我们可以看到结果了,如果pixels[]中的数值为int默认值(0)的话,图片相应的部分就为背景色,如果设置为别的初始值而在运行中没有被修改的话,背景色就是修改值对应的RGB颜色.

    原图位置(offset)
    下面设置下getPixels[]方法中offset,使得黄色部分截图出现在它在原图中的位置,

    offset = x + y*w ,本例代码如下: 

     int[] pixels = new int[w*h]; for(int i=0; i<w*h; i++){  pixels[i] = -2578654;  } mBitmap2.getPixels(pixels, 50, w, 50, 0, w/2, h/2; mBitmap3 = Bitmap.createBitmap(pixels, 0, w, w, h, Bitmap.Config.ARGB_8888); mBitmap4 = Bitmap.createBitmap(pixels, 0, w, w, h, Bitmap.Config.ARGB_4444); String txt = String.valueOf(pixels[10]); Log.i("myBitmapDecode", "w = " + w + "; h = " + h); Log.i("myBitmapDecode", "pixels[0] = " + pixels[0] + "; pixels[1] = " + pixels[1] + "; pixels[10] = " + pixels[10]); Log.i("myBitmapDecode", "pixels[w] = " + pixels[w] + "; pixels[h] = " + pixels[h] + "; pixels[w*h-1] = " + pixels[w*h-1]);

    运行结果:
     
    I/myBitmapDecode(  761): w = 100; h = 100
    I/myBitmapDecode(  761): pixels[0] = -2578654; pixels[1] = -2578654;
    pixels[10] = -2578654
    I/myBitmapDecode(  761): pixels[w] = -2578654; pixels[h] = -2578654; pixels[w*h-1] = -2578654

    当然可以用这个方法进行更复杂的运算,诸如截取素材图片修改目标图片(已存储至pixels数组中)的指定区域!!


    背景色设置(pixels[])

    背景颜色与pixels[]初始值一致,如红色RED(-65536 0xffff0000),黄色YELLOW(-256 0xffffff00),具体详见下面附注

     int[] pixels = new int[w*h]; for(int i=0; i<w*h; i++){  pixels[i] = -65536;  // Color.RED : -65536 (0xffff0000) } mBitmap2.getPixels(pixels, 50, w, 50, 0, w/2, h/2); mBitmap3 = Bitmap.createBitmap(pixels, 0, w, w, h, Bitmap.Config.ARGB_8888);  Log.i("myBitmapDecode", "w = " + w + "; h = " + h); Log.i("myBitmapDecode", "pixels[0] = " + pixels[0] + "; pixels[1] = " + pixels[1] + "; pixels[10] = " + pixels[10] + "; pixels[50] = " + pixels[50]); Log.i("myBitmapDecode", "pixels[w] = " + pixels[w] + "; pixels[h] = " + pixels[h] + "; pixels[w*h-1] = " + pixels[w*h-1]);  for(int i=0; i<w*h; i++){  pixels[i] = -256;    // Color.YELLOW : -256 (0xffffff00) } mBitmap2.getPixels(pixels, 50*100 + 50, w, 50, 50, w/2, h/2); mBitmap4 = Bitmap.createBitmap(pixels, 0, w, w, h, Bitmap.Config.ARGB_4444); Log.i("myBitmapDecode", "w = " + w + "; h = " + h); Log.i("myBitmapDecode", "pixels[0] = " + pixels[0] + "; pixels[1] = " + pixels[1] + "; pixels[10] = " + pixels[10] + "; pixels[50] = " + pixels[50]); Log.i("myBitmapDecode", "pixels[w] = " + pixels[w] + "; pixels[h] = " + pixels[h] + "; pixels[w*h-1] = " + pixels[w*h-1]);

    运行结果:


    I/myBitmapDecode( 1671): w = 100; h = 100
    I/myBitmapDecode( 1671): pixels[0] = -65536; pixels[1] = -65536; pixels[10] = -65536; pixels[50] = -16777216
    I/myBitmapDecode( 1671): pixels[w] = -65536; pixels[h] = -65536; pixels[w*h-1] = -65536
    I/myBitmapDecode( 1671): w = 100; h = 100
    I/myBitmapDecode( 1671): pixels[0] = -256; pixels[1] = -256; pixels[10] = -256; pixels[50] = -256
    I/myBitmapDecode( 1671): pixels[w] = -256; pixels[h] = -256; pixels[w*h-1] = -16735513


    图片拼接:

    假设两张图片大小都为 w * h ,getPixels()方法中设置参数pixels[2*w*h],参数offset = 0,stride = 2*w读取第一张图片,再次运行getPixels()方法,设置参数offset = w,stride = 2*w,读取第二张图片,再将pixels[]绘制到画布上就可以看到两张图片已经拼接起来了.

    示例如下: 

     int w = mBitmap2.getWidth(); int h = mBitmap2.getHeight(); int[] pixels = new int[2*w*h]; for(int i=0; i<2*w*h; i++){  pixels[i] = -2578654;  } mBitmap2.getPixels(pixels, 0, 2*w, 0, 0, w, h); mBitmap2.getPixels(pixels, w, 2*w, 0, 0, w, h); mBitmap3 = Bitmap.createBitmap(pixels, 0, 2*w, 2*w, h, Bitmap.Config.ARGB_8888); String txt = String.valueOf(pixels[10]); Log.i("myBitmapDecode", "w = " + w + "; h = " + h); Log.i("myBitmapDecode", "pixels[0] = " + pixels[0] + "; pixels[1] = " + pixels[1] + "; pixels[10] = " + pixels[10]); Log.i("myBitmapDecode", "pixels[w] = " + pixels[w] + "; pixels[h] = " + pixels[h] + "; pixels[w*h-1] = " + pixels[w*h-1]); Log.i("myBitmapDecode", "pixels[2*w-1] = " + pixels[2*w-1] + "; pixels[2*w] = " + pixels[2*w] + "; pixels[2*w*h-1] = " + pixels[2*w*h-1]);

    运行结果: 

    I/myBitmapDecode(  989): w = 100; h = 100
    I/myBitmapDecode(  989): pixels[0] = -16777216; pixels[1] = -16777216;
    pixels[10] = -16777216
    I/myBitmapDecode(  989): pixels[w] = -16777216; pixels[h] = -16777216; pixels[w*h-1] = -16777216
    I/myBitmapDecode(  989): pixels[2*w-1] = -3328; pixels[2*w] = -16777216; pixels[2*w*h-1] = -16735513

    第二种: 
    stride表示数组pixels[]中存储的图片每行的数据,在其中可以附加信息,即
    stride = width + padding,如下图所示



    这样可以不仅仅存储图片的像素信息,也可以储存相应每行的其它附加信息.


    最后,stride参数的意义及用处总结如下:


    1 用来表示pixels[]数组中每行的像素个数,用于行与行之间区分,绝对值必须大于参数width,但不必大于所要读取图片的宽度w(在width < w 时成立).(stride负数有何作用不知,存疑).另,pixels.length >= stride * height,否则会抛出ArrayIndexOutOfBoundsException异常

    2 stride > width时,可以在pixels[]数组中添加每行的附加信息,可做它用.




    附注(Color颜色对应值):

    Constants

    public static final int BLACK

    Since: API Level 1

    Constant Value: -16777216 (0xff000000)

    public static final int BLUE

    Since: API Level 1

    Constant Value: -16776961 (0xff0000ff)

    public static final int CYAN

    Since: API Level 1

    Constant Value: -16711681 (0xff00ffff)

    public static final int DKGRAY

    Since: API Level 1

    Constant Value: -12303292 (0xff444444)

    public static final int GRAY

    Since: API Level 1

    Constant Value: -7829368 (0xff888888)

    public static final int GREEN

    Since: API Level 1

    Constant Value: -16711936 (0xff00ff00)

    public static final int LTGRAY

    Since: API Level 1

    Constant Value: -3355444 (0xffcccccc)

    public static final int MAGENTA

    Since: API Level 1

    Constant Value: -65281 (0xffff00ff)

    public static final int RED

    Since: API Level 1

    Constant Value: -65536 (0xffff0000)

    public static final int TRANSPARENT

    Since: API Level 1

    Constant Value: 0 (0x00000000)

    public static final int WHITE

    Since: API Level 1

    Constant Value: -1 (0xffffffff)

    public static final int YELLOW

    Since: API Level 1

    Constant Value: -256 (0xffffff00)


    引用参考:

    1, int, int, int, int, int, int)]Android英文文档getPixels()方法介绍

    3 StackOverflow中关于getPixels()问答.

    Using the LockBits method to access image data



               

    分享一下我老师大神的人工智能教程。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.csdn.net/jiangjunshow

    展开全文
  • <p><strong>camera.data.renderTarget.getPixels();</strong> // returns an error camera.data.renderTarget is null <p>or <strong>camera.data.renderTarget.at(10,10);</strong> // idem error <p>for the ...
  • omxPlayer.getPixels()" from the "example-pixels". <p>the pixel data collected by "omxPlayer.getPixels()" is only half the resolution of the original video, same with the omxPlayer....
  • Bimap getPixels方法研究

    千次阅读 2014-12-10 18:42:05
    Android bitmap getPixels有俩个方法,这个俩个方法都是获取图片的pixel的。 1、getPixel(int x, int y) 2、getPixels(int[] pixels, int offset, int stride, int x, int y, int width, int height) 先来看第1个...
  • 原创 Android Bitmap入门:getPixels的正确理解 ...
  • Bitmap 之 getPixels() 的 stride

    万次阅读 2012-03-01 10:25:34
    学习Graphics中遇到位图(Bitmap)中getPixels()方法,对该方法的用法大体理解,但对其中的stride参数却不明白具体的用法以及用意,现记述过程如下: getPixels()方法的用处为获取位图(Bitmap)中的像素值(颜色值),...
  • 这玩意的作用吧,第一能帮你更深层理解bitmap,其次bitmap...getPixels(int[] pixels , int offset , int stride , int x , int y ,int width , int height) createBitmap(int[] colors , int offset , int stride...
  • texture.GetPixels(0, 0, texture.width, texture.height, 0); // Test SetPixel ////for (int i = 0; i < texture.width / 2; i++) ////{ //// for (int j = 0; j < texture.height / ...
  • b.getPixels(pixels, 0, b.getWidth(), 0, 0, b.getWidth(), b.getHeight()); for(int i = 0 ; i ; i++){ Log.d("test","Pixel is :"+pixels[i]); } } 其中R.drawable.test是 .bmp 文件,位于res/...
  • 在学习Graphics中遇到位图(Bitmap)中getPixels()方法,对该方法的用法大体理解,但对其中的stride参数却不明白具体的用法以及用意,经过一番折腾后,有些明了,现记述过程如下:  行文有些详细,请赶时间的同学...
  • Bitmap类getPixels()方法中参数stride理解 androidgetpixelsstridebitmapgraphics   在学习Graphics中遇到位图(Bitmap)中getPixels()方法,对该方法的用法大体理解,但对其中的stride参数却不明白具体的...
  • 在做图片处理时,需要获取图像的每一位点的数据进行处理,这时就需要用到Bitmap类中的getPixels()方法。
  • 在学习Graphics中遇到位图(Bitmap)中getPixels()方法,对该方法的用法大体理解,但对其中的stride参数却不明白具体的用法以及用意,经过一番折腾后,有些明了,现记述过程如下: 行文有些详细,请赶时间的同学直接跳...

空空如也

空空如也

1 2 3 4 5 ... 11
收藏数 216
精华内容 86
关键字:

getpixels