2012-03-11 53 views
9

我创建了一个可以拍摄和保存照片的应用程序。 我在预览之上有预览和覆盖。 叠加定义了一个正方形(广场周围的区域显示预览有点暗),你可以在图片中看到:Android相机 - 如何从字节数组中获取特定的“矩形”?

example

我需要做的是提取图像的一部分广场在哪里。 广场定义如下:

Rect frame = new Rect(350,50,450,150); 

我该怎么做?我有我可以保存的字节数组(byte []数据),但是我想更改应用程序,以便只保存正方形区域。

编辑:我曾尝试以下:

int[] pixels = new int[100000]; 
      ByteArrayOutputStream bos = new ByteArrayOutputStream(); 
      Bitmap bitmap = BitmapFactory.decodeByteArray(data , 0, data.length); 
      bitmap.getPixels(pixels, 0, 480, 350, 50, 100, 100); 
      bitmap = Bitmap.createBitmap(pixels, 0, 100, 100, 100, Config.ARGB_4444); 
      bitmap.compress(CompressFormat.JPEG, 0, bos); 
      byte[] square = bos.toByteArray(); 

然后写入阵列“广场”,以一个新的文件... 的问题是,我得到由线的照片......有是与我做的转换的问题

+0

Epically简单的解决方案... http://stackoverflow.com/a/17733530/294884 – Fattie 2014-05-25 20:49:45

+0

@Eyal所以你只是想从字节[]中裁剪矩形区域而不保存它们之间? – ashishdhiman2007 2017-02-02 09:49:50

回答

8

我花了一些时间来弄清楚,代码应该是这样的:

int[] pixels = new int[100*100];//the size of the array is the dimensions of the sub-photo 
     ByteArrayOutputStream bos = new ByteArrayOutputStream(); 
     Bitmap bitmap = BitmapFactory.decodeByteArray(data , 0, data.length); 
     bitmap.getPixels(pixels, 0, 100, 350, 50, 100, 100);//the stride value is (in my case) the width value 
     bitmap = Bitmap.createBitmap(pixels, 0, 100, 100, 100, Config.ARGB_8888);//ARGB_8888 is a good quality configuration 
     bitmap.compress(CompressFormat.JPEG, 100, bos);//100 is the best quality possibe 
     byte[] square = bos.toByteArray(); 
3

相机预览数据以YUV格式(特别是ImageFormat.NV21),BitmapFactory不直接支持。您可以使用YuvImage将其转换为位图here。唯一的区别是,您需要在调用YuvImage.compressToJpeg时传递对应于您想要的正方形的Rect。

+0

嗨,感谢您的帮助,我尝试过使用YuvImage,但结果很麻烦,压缩后我得到了一个充满彩色点的屏幕... – Eyal 2012-03-12 10:01:00

相关问题