2010-03-30 50 views
36

Tôi đã thử một vài cách để thử xem trước máy ảnh để hiển thị theo chiều dọc trên SurfaceView. Không có gì hiệu quả. Tôi đang thử nghiệm trên một Droid có 2.0.1. Tôi cố gắng:Máy ảnh Android ở chế độ dọc trên SurfaceView

1) buộc bố trí là chân dung bởi: this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

2) sử dụng

Camera.Parameters parameters = camera.getParameters(); 
parameters.set("orientation", "portrait"); 
parameters.setRotation(90); 
camera.setParameters(parameters); 

Có điều gì khác tôi có thể thử? Nếu đây là lỗi trong Android hoặc điện thoại, làm thế nào tôi có thể đảm bảo rằng đây là trường hợp để tôi có bằng chứng để thông báo cho khách hàng?

Cảm ơn, Prasanna

+0

Có một cái nhìn - http://stackoverflow.com/questions/10259299/force-a-camera-to-always-open-in-portrait-mode-in-android/10259572#10259572 –

+0

có thể bất kỳ một trong những trợ giúp http://stackoverflow.com/questions/28379130/how-to-set-camera-image-orientation –

Trả lời

10

tôi có một giải pháp làm việc cho chế độ chân dung làm việc trong 2.1 (thử nghiệm trên Desire) có thể ít hơn.

Hướng màn hình hoạt động được đặt thành dọc. (android: screenOrientation = "chân dung")

các thông số camera:

Camera.Parameters p = mCamera.getParameters();

p.set("jpeg-quality", 100); 
p.set("orientation", "landscape"); 
p.set("rotation", 90); 
p.setPictureFormat(PixelFormat.JPEG); 
p.setPreviewSize(h, w);// here w h are reversed 
mCamera.setParameters(p); 

và hình ảnh sẽ thẳng đứng.

SurfaceHolder bạn sử dụng cho máy ảnh phải ở kích thước tương thích với kích thước xem trước điện thoại độ phân giải màn hình bình thường.

vui trên Desire 2.2 không được làm việc ... Đây là việc sửa chữa:

At surfaceCreated(..) or when you have this line 
camera = Camera.open(); 
     add 
camera.setDisplayOrientation(90);//only 2.2> 

Camera.Parameters p = camera.getParameters(); 
    p.set("jpeg-quality", 100); 
p.setRotation(90); 
p.setPictureFormat(PixelFormat.JPEG); 
p.setPreviewSize(h, w); 
camera.setParameters(p); 
0

Không cần bạn phải thiết lập bất kỳ tham số cho định hướng cho đến khi bạn cần phải làm điều đó một cách rõ ràng. Theo mặc định, nó hỗ trợ cơ sở này. Trong trường hợp của tôi, tôi có một Hoạt động và ở trên hoạt động đó tôi có chế độ xem máy ảnh, vì vậy tôi đã không đặt bất kỳ hướng nào cho thuộc tính máy ảnh, thay vào đó hoạt động tôi đặt hướng như hình chân dung trong tệp kê khai. bây giờ ứng dụng trông và hoạt động tốt. Có thể hữu ích cho một số người ..

Cảm ơn.

61

Tính đến API lvl 8, đây là có sẵn:

công thức khoảng trống setDisplayOrientation (độ int)

tức với portait trong biểu hiện:

public void surfaceCreated(SurfaceHolder holder) { 
    mCamera = Camera.open(); 
    mCamera.setDisplayOrientation(90); 
+12

Tôi đã làm điều này nhưng byte [] Tôi nhận được vẫn mang lại cho tôi một bức ảnh phong cảnh. – tasomaniac

+3

Đặt mCamera.setDisplayOrientation (90); xem camera Ok, Nhưng kết quả video không giống với Camera View, nó không quay 90. tại sao? – mum

+0

Hey, bạn có thể sử dụng phương thức param.setRotation (..) cho việc này. Tôi vẫn đang cố gắng tìm ra cách nó hoạt động. Thật tuyệt vời! – sunlover3

10

Bạn có thể thử này (tốt cho 2.2 hoặc thấp hơn). Ở đây tôi xoay hình ảnh trước khi lưu nó vào thẻ sd. Nhưng nó chỉ dành cho chế độ dọc. Nếu bạn phải làm cho cả hai chế độ sau đó bạn nên kiểm tra hướng camera và đặt một số kiểm tra trước khi chụp ảnh.

PictureCallback jpegCallback = new PictureCallback() { 
    public void onPictureTaken(byte[] data, Camera camera) { 
     FileOutputStream outStream = null; 
     try { 
     imageFilePath = getFilename(); 
     InputStream is = new ByteArrayInputStream(data); 
     Bitmap bmp = BitmapFactory.decodeStream(is); 
     // Getting width & height of the given image. 
     if (bmp != null){ 
      int w = bmp.getWidth(); 
      int h = bmp.getHeight(); 
      // Setting post rotate to 90 
      Matrix mtx = new Matrix(); 
      mtx.postRotate(90); 
      // Rotating Bitmap 
      Bitmap rotatedBMP = Bitmap.createBitmap(bmp, 0, 0, w, h, mtx, true); 
      ByteArrayOutputStream stream = new ByteArrayOutputStream(); 
      rotatedBMP.compress(Bitmap.CompressFormat.PNG, 100, stream); 
      byte[] byteArray = stream.toByteArray(); 
      outStream = new FileOutputStream 
           (String.format(imageFilePath,System.currentTimeMillis())); 
      outStream.write(byteArray); 
      outStream.close(); 
     } else { 
      outStream = new FileOutputStream 
           (String.format(imageFilePath,System.currentTimeMillis())); 
      outStream.write(data); 
      outStream.close();   
     }  

     preview.camera.startPreview(); 
    } catch (FileNotFoundException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } finally { 
    } 
    } 
}; 
+1

Mã này là để xoay hình ảnh, không phải xem trước khi được yêu cầu. –

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