12

I am using the following code. The image is saved but it is BLACK.
Please see my code and tell me where I am doing wrong.
I am using this code in the Menu.

case R.id.id_menu_Save:

            Bitmap bmp = SavePixels(0, 0, 800, 400, CCDirector.sharedDirector().gl);

            File file = new File("/sdcard/test.jpg");
            try
            {
                file.createNewFile();
                FileOutputStream fos = new FileOutputStream(file);
                bmp.compress(CompressFormat.JPEG, 100, fos);

                Toast.makeText(getApplicationContext(), "Image Saved", 0).show();
                Log.i("Menu Save Button", "Image saved as JPEG");
            }

            catch (Exception e)
            {
                e.printStackTrace();
            }

            break;

This is my Save Image Function.

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;
}

Apart from above, what I want from you is to point me in the right direction. Like if I have to get the pixels of the screen, what class/entity should I be exploring?

BenMorel
  • 34,448
  • 50
  • 182
  • 322
Noman
  • 4,049
  • 10
  • 38
  • 59
  • I haven't ever tried to do this, but I would assume apps need some permission to be able to read the screen. – P Varga Dec 19 '11 at 20:40
  • gl.glReadPixels(x, 0, w, y+h, GL10.GL_RGBA, GL10.GL_UNSIGNED_BYTE, ib); This line is giving the error... what should I do ? – Akarsh M Aug 14 '13 at 13:44

2 Answers2

2

just try to change GL10.GL_RGB or make changes in bitmap.config . It might be work.

karthik
  • 17,453
  • 70
  • 78
  • 122
  • gl.glReadPixels(x, 0, w, y+h, GL10.GL_RGBA, GL10.GL_UNSIGNED_BYTE, ib); This line is giving the error... what should I do ? – Akarsh M Aug 14 '13 at 13:45
2

Just change SavePixelx method to the below:

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)&0xffff0000;
               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;
}
Stephen
  • 1,737
  • 2
  • 26
  • 37
jeet
  • 29,001
  • 6
  • 52
  • 53
  • gl.glReadPixels(x, 0, w, y+h, GL10.GL_RGBA, GL10.GL_UNSIGNED_BYTE, ib); This line is giving the error... what should I do ? – Akarsh M Aug 14 '13 at 13:46