2012-03-11 32 views
9

Tôi đã tạo một ứng dụng chụp và lưu ảnh. Tôi có bản xem trước và lớp phủ ở đầu bản xem trước đó. Lớp phủ xác định một hình vuông (khu vực xung quanh quảng trường cho thấy chế độ xem trước một tối hơn chút), như bạn có thể nhìn thấy trong hình:Android Camera - Làm thế nào tôi có thể lấy một "hình chữ nhật" cụ thể từ mảng byte?

example

gì tôi cần phải làm là để trích xuất các phần của hình ảnh nơi hình vuông là. Hình vuông được định nghĩa như sau:

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

Tôi có thể làm như thế nào? tôi có mảng byte (byte [] dữ liệu) mà tôi có thể lưu, nhưng tôi muốn thay đổi ứng dụng để chỉ có diện tích hình vuông sẽ được lưu.

Edit: tôi đã thử như sau:

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(); 

và sau đó viết mảng "vuông" vào một tập tin mới ... Vấn đề là tôi nhận được một bức tranh làm bằng dây chuyền ... có là một vấn đề với việc chuyển đổi mà tôi đã thực hiện

+0

giải pháp sử thi cực đơn giản ... http://stackoverflow.com/a/17733530/294884 – Fattie

+0

@Eyal Vì vậy, bạn chỉ muốn cắt khu vực hình chữ nhật từ byte [] mà không lưu nó ở giữa? – ashishdhiman2007

Trả lời

8

Tôi đã mất một thời gian để tìm ra rằng mã sẽ giống như thế này:

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

Dữ liệu xem trước máy ảnh có định dạng YUV (cụ thể là ImageFormat.NV21), mà BitmapFactory không hỗ trợ trực tiếp. Bạn có thể sử dụng YuvImage để chuyển đổi nó thành một Bitmap như được mô tả here. Sự khác biệt duy nhất là bạn sẽ muốn chuyển một Rect tương ứng với hình vuông mà bạn muốn khi gọi YuvImage.compressToJpeg.

+0

Xin chào, cảm ơn sự giúp đỡ, tôi đã thử sử dụng YuvImage nhưng kết quả là lộn xộn và sau khi nén tôi có một màn hình đầy những chấm đầy màu sắc ... – Eyal

Các vấn đề liên quan