2011-01-19 57 views
5

Tôi đã tìm kiếm rất nhiều về chụp ảnh màn hình của đối tượng OpenGL của tôi trên Android và đưa ra giải pháp this. Nó hoạt động rất tốt nhưng trong trường hợp của tôi, tôi có chế độ xem camera và chế độ xem opengl (với nền trong suốt) ở phía trên cùng của chế độ xem máy ảnh. Vì vậy, những gì tôi muốn làm là để có được ảnh chụp màn hình opengl với nền trong suốt thay vì màu đen. Như tôi đã nói tôi đã thử liên kết ở trên và nó hoạt động nhưng tôi bị mắc kẹt với nền đen. Đó là một chút phức tạp để tìm ra cách để thoát khỏi nền đen trong trường hợp cụ thể này. Hy vọng ai đó có thể giúp tôi và càng sớm càng tốt nếu nó có thể (tôi cũng nghĩ rằng giải pháp là dễ dàng, tôi chỉ thiếu một cái gì đó đơn giản). Cảm ơn bạn.Ảnh chụp màn hình OpenGL Android

Trả lời

13

Tôi đã sử dụng phương pháp sau đây và làm việc như một nhà vô địch.

public static Bitmap SavePixels(int x, int y, int w, int h, GL10 gl) 
{ 
    int b[]=new int[w*(y+h)]; 
    int bt[]=new int[w*h]; 
    IntBuffer ib=IntBuffer.wrap(b); 
    ib.position(0); 
    gl.glReadPixels(x, 0, w, y+h, GL10.GL_RGBA, GL10.GL_UNSIGNED_BYTE, ib); 

    for(int i=0, k=0; i<h; i++, k++) 
    {//remember, that OpenGL bitmap is incompatible with Android bitmap 
     //and so, some correction need.   
      for(int j=0; j<w; j++) 
      { 
       int pix=b[i*w+j]; 
       int pb=(pix>>16)&0xff; 
       int pr=(pix<<16)&0x00ff0000; 
       int pix1=(pix&0xff00ff00) | pr | pb; 
       bt[(h-k-1)*w+j]=pix1; 
      } 
    } 


    Bitmap sb=Bitmap.createBitmap(bt, w, h, Bitmap.Config.ARGB_8888); 
    return sb; 
} 

Bạn chỉ cần gọi

YourClass.SavePixels(0,0,width,height,gl); 

Tôi hy vọng điều này sẽ làm việc cho bạn ...

Cảm ơn, Midhun

+0

Có vẻ đầy hứa hẹn! Xin lỗi đã được siêu bận rộn ... sẽ kiểm tra nó sớm. –

+1

Ok nó đã hoạt động! cảm ơn bạn! –

+1

không hoạt động cho tôi: ( – Noman

5

Giải pháp bạn đã đề cập là sử dụng Bitmap.Config.RGB_565 không hỗ trợ kênh alpha.

Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.RGB_565); 

Thay vào đó bạn nên sử dụng Bitmap.Config.ARGB_8888 hoặc Bitmap.Config.ARGB_4444.

+0

Cảm ơn bạn. Tôi đã cố gắng sử dụng ARGB_4444 và tôi đã nhận được hình ảnh với màu sắc sai lầm (tôi nghĩ rằng một cái gì đó đã thay đổi và nó có cái nhìn hài hước của nhiều màu sắc khác nhau). Tôi nghĩ rằng tôi cần phải thay đổi thuật toán chuyển đổi pixel thành rgb. Khi tôi thử 8888 tôi gặp lỗi về kích thước của bitmap. Làm thế nào tôi nên thay đổi kích thước? –

+0

ARGB_4444 'messes up' màu sắc của bạn bởi vì nó sử dụng một nửa số lượng không gian để lưu các thông tin tương tự. Trong khi RGB_8888 sử dụng 8 bit cho mỗi kênh (R, G, B và kênh alpha) RGB_4444 sử dụng 4 bit cho mỗi kênh, do đó cắt ngắn thông tin và mang lại chất lượng nhận thức rất kém. Các hiệu ứng nổi bật nhất là dải và biến dạng màu sắc. Một số kỹ thuật phối màu cố gắng giải quyết nó, nhưng tôi không biết liệu chúng có sẵn tự nhiên trong Android hay không. Nếu 8888 cung cấp cho bạn lỗi bộ nhớ, hãy thử giảm kích thước của bitmap. Có thể thiết bị của bạn không có đủ RAM. – RedOrav

+2

Ngay cả khi sử dụng Bitmap.Config.ARGB_8888, cho một nền đen. – pallavi

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