在android中将图像转换为二进制图像

Posted

技术标签:

【中文标题】在android中将图像转换为二进制图像【英文标题】:convert an image to binary image in android 【发布时间】:2013-08-13 12:15:22 【问题描述】:

我正在尝试构建简单的 android 项目以将图像转换为二进制格式,但是当我检查像素值时,我只得到零。我不知道问题出在哪里。任何人都可以帮助我。这是我的代码

iv = (ImageView) findViewById (R.id.uploadImage);

//convert the image view into bitmap
iv.buildDrawingCache();
bmap = iv.getDrawingCache();

int red;
int newPixel = 0;
int threshold =230;
int width = bmap.getWidth();
int hieght = bmap.getHeight();
int[] pix = new int[width * hieght];
int[] pix2 = new int[width * hieght];
int alpha = 0;

bmap.getPixels(pix, 0, width, 0, 0, width, hieght);

//convert the image into white and black
for (int i=0;i<width;i++)   
  for (int j=0;j<hieght;j++) 
    int index = j * width + i;

    red = (pix[index] >> 16) & 0xff;
    alpha = (pix[index] >> 24) & 0xff;

    if (red<threshold) 
      newPixel = 0;
     else 
      newPixel = 255;
    
    newPixel = colorToRGB(alpha, newPixel, newPixel, newPixel);
    bmap.setPixel(i, j, newPixel);
    iv.setImageBitmap(bmap);     
  
 

//convert the black and white image view into bitmap                                    
bmap.getPixels(pix2, 0, bmap.getWidth(), 0, 0, bmap.getWidth(),bmap.getHeight());

StringBuilder builder = new StringBuilder();
for (int i :pix2) 
  builder.append("   " + i + "    ");

Toast.makeText(this, builder, Toast.LENGTH_LONG).show();

private static int colorToRGB (int alpha, int red, int green, int blue) 
  int newPixel = 0;
  newPixel += alpha;
  newPixel = newPixel << 8;
  newPixel += red; newPixel = newPixel << 8;
  newPixel += green; newPixel = newPixel << 8;
  newPixel += blue;
  return newPixel;

这是日志猫

08-12 08:52:32.887: D/dalvikvm(774): GC_CONCURRENT 释放 71K, 7% free 2765K/2964K,暂停23ms+15ms,共94ms

08-12 08:52:33.497:D/gralloc_goldfish(774):没有 GPU 的模拟器 检测到仿真。

08-12 08:52:40.698: D/dalvikvm(774): GC_CONCURRENT 释放 63K,释放 6% 3087K/3272K,暂停73ms+3ms,共165ms

08-12 08:52:49.397:I/Choreographer(774):跳过 39 帧!这 应用程序可能在其主线程上做了太多工作。

08-12 08:52:54.568: D/dalvikvm(774): GC_FOR_ALLOC 释放 9K,释放 5% 3124K/3272K,暂停68ms,共81ms

08-12 08:52:54.617: I/dalvikvm-heap(774): 将堆(碎片案例)增长到 6.166MB 分配 3145744 字节

08-12 08:52:54.778: D/dalvikvm(774): GC_FOR_ALLOC 释放 40K,释放 4% 6155K/6348K,暂停156ms,共156ms

08-12 08:52:55.008: D/dalvikvm(774): GC_CONCURRENT freed

08-12 08:52:55.898:I/Choreographer(774):跳过 412 帧!这 应用程序可能在其主线程上做了太多工作。

08-12 08:52:57.898: D/dalvikvm(774): GC_FOR_ALLOC 释放 38K,释放 4% 6119K/6348K,暂停28ms,共30ms

08-12 08:52:57.929: I/dalvikvm-heap(774): 将堆(frag case)增长到 9.091MB 分配 3145744 字节

08-12 08:52:58.058: D/dalvikvm(774): GC_CONCURRENT freed

08-12 08:52:58.058: D/dalvikvm(774): WAIT_FOR_CONCURRENT_GC 阻塞 40毫秒

08-12 08:52:58.089: I/dalvikvm-heap(774): 将堆(碎片情况)增长到 12.090MB 分配 3145744 字节

08-12 08:52:58.218: D/dalvikvm(774): GC_FOR_ALLOC 释放

08-12 08:52:58.288: D/dalvikvm(774): GC_CONCURRENT freed 0K, 2% free 12263K/12500K,暂停4ms+16ms,共70ms

08-12 08:56:37.707:E/Trace(886):打开跟踪文件时出错:没有这样的 文件或目录 (2) 08-12 08:56:38.518: D/dalvikvm(886): GC_CONCURRENT 释放 41K,6% 释放 2805K/2968K,暂停 13ms+3ms,总计 77毫秒

08-12 08:56:38.518: D/dalvikvm(886): WAIT_FOR_CONCURRENT_GC 阻塞 10毫秒

08-12 08:56:38.727:D/gralloc_goldfish(886):没有 GPU 的模拟器 检测到仿真。

08-12 08:56:55.107: D/dalvikvm(886): GC_FOR_ALLOC 释放 23K,释放 5% 3083K/3236K,暂停69ms,共78ms

08-12 08:56:55.207: I/dalvikvm-heap(886): 将堆(碎片案例)增长到 6.126MB 分配 3145744 字节

08-12 08:56:55.367: D/dalvikvm(886): GC_FOR_ALLOC 释放 1K,释放 3% 6153K/6312K,暂停156ms,共156ms

08-12 08:56:55.607: D/dalvikvm(886): GC_CONCURRENT 释放 4K,3% 释放 6149K/6312K,暂停80ms+32ms,共245ms

08-12 08:56:56.747:I/Choreographer(886):跳过 465 帧!这 应用程序可能在其主线程上做了太多工作。

08-12 08:58:03.287: D/dalvikvm(936): GC_CONCURRENT 释放 44K,释放 6% 2805K/2972K,暂停15ms+3ms,共76ms

08-12 08:58:03.287: D/dalvikvm(936): WAIT_FOR_CONCURRENT_GC 阻塞 9毫秒

08-12 08:58:03.637:D/gralloc_goldfish(936):没有 GPU 的模拟器 检测到仿真。

【问题讨论】:

可能是您的图像中没有红色。 希望对您有所帮助***.com/questions/13770181/… 【参考方案1】:

可能是因为您要转换的位图是零字节:

//convert the image view into bitmap
            iv.buildDrawingCache();
            bmap = iv.getDrawingCache();

试试这个:

BitmapDrawable bd = (BitmapDrawable) iv.getDrawable();
            bmap = bd.getBitmap();

希望这会有所帮助。

【讨论】:

当我这样做时,我得到这个异常 java.lang.illegalstateexception 异常抛出在哪里?请发布你的logcat 我在上面贴了 logcat 请贴出引发异常的logcat,上面的logcat没有说明异常。

以上是关于在android中将图像转换为二进制图像的主要内容,如果未能解决你的问题,请参考以下文章

如何在reactjs中将数据二进制转换为图像?

MongoDB & Multer - 如何将缓冲区二进制文件转换为图像?

如何在本机反应中将图像读取为二进制/ blob

如何在opencv中将绘制在图像上的画笔绘图保存为填充和单独的二进制掩码?

从二进制图像中查找坐标并将它们投影到原始图像[关闭]

如何在xamarin android中将位图图像转换为gif?