android imageview 截图,android – 如何从surfaceview创建和保存屏幕截图?

我希望你使用过这里发布的解决方案

Get screenshot of surfaceView in Android

SurfaceView的表面独立于绘制View元素的表面.因此捕获View内容将不包括SurfaceView ………

public class Cam_View extends Activity implements SurfaceHolder.Callback {

protected static final int CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE = 0;

private SurfaceView SurView;

private SurfaceHolder camHolder;

private boolean previewRunning;

final Context context = this;

public static Camera camera = null;

private RelativeLayout CamView;

private Bitmap inputBMP = null, bmp, bmp1;

private ImageView mImage;

@SuppressWarnings("deprecation")

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.camera);

CamView = (RelativeLayout) findViewById(R.id.camview);//RELATIVELAYOUT OR

//ANY LAYOUT OF YOUR XML

SurView = (SurfaceView)findViewById(R.id.sview);//SURFACEVIEW FOR THE PREVIEW

//OF THE CAMERA FEED

camHolder = SurView.getHolder(); //NEEDED FOR THE PREVIEW

camHolder.addCallback(this); //NEEDED FOR THE PREVIEW

camHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);//NEEDED FOR THE PREVIEW

camera_image = (ImageView) findViewById(R.id.camera_image);//NEEDED FOR THE PREVIEW

Button btn = (Button) findViewById(R.id.button1); //THE BUTTON FOR TAKING PICTURE

btn.setOnClickListener(new OnClickListener() { //THE BUTTON CODE

public void onClick(View v) {

camera.takePicture(null, null, mPicture);//TAKING THE PICTURE

//THE mPicture IS CALLED

//WHICH IS THE LAST METHOD(SEE BELOW)

}

});

}

@Override

public void surfaceChanged(SurfaceHolder holder, int format, int width,//NEEDED FOR THE PREVIEW

int height) {

if(previewRunning) {

camera.stopPreview();

}

Camera.Parameters camParams = camera.getParameters();

Camera.Size size = camParams.getSupportedPreviewSizes().get(0);

camParams.setPreviewSize(size.width, size.height);

camera.setParameters(camParams);

try {

camera.setPreviewDisplay(holder);

camera.startPreview();

previewRunning=true;

} catch(IOException e) {

e.printStackTrace();

}

}

public void surfaceCreated(SurfaceHolder holder) { //NEEDED FOR THE PREVIEW

try {

camera=Camera.open();

} catch(Exception e) {

e.printStackTrace();

Toast.makeText(getApplicationContext(),"Error",Toast.LENGTH_LONG).show();

finish();

}

}

@Override

public void surfaceDestroyed(SurfaceHolder holder) { //NEEDED FOR THE PREVIEW

camera.stopPreview();

camera.release();

camera=null;

}

public void TakeScreenshot(){ //THIS METHOD TAKES A SCREENSHOT AND SAVES IT AS .jpg

Random num = new Random();

int nu=num.nextInt(1000); //PRODUCING A RANDOM NUMBER FOR FILE NAME

CamView.setDrawingCacheEnabled(true); //CamView OR THE NAME OF YOUR LAYOUR

CamView.buildDrawingCache(true);

Bitmap bmp = Bitmap.createBitmap(CamView.getDrawingCache());

CamView.setDrawingCacheEnabled(false); // clear drawing cache

ByteArrayOutputStream bos = new ByteArrayOutputStream();

bmp.compress(CompressFormat.JPEG, 100, bos);

byte[] bitmapdata = bos.toByteArray();

ByteArrayInputStream fis = new ByteArrayInputStream(bitmapdata);

String picId=String.valueOf(nu);

String myfile="Ghost"+picId+".jpeg";

File dir_image = new File(Environment.getExternalStorageDirectory()+//

File.separator+"Ultimate Entity Detector"); //

dir_image.mkdirs(); //

//^IN THESE 3 LINES YOU SET THE FOLDER PATH/NAME . HERE I CHOOSE TO SAVE

//THE FILE IN THE SD CARD IN THE FOLDER "Ultimate Entity Detector"

try {

File tmpFile = new File(dir_image,myfile);

FileOutputStream fos = new FileOutputStream(tmpFile);

byte[] buf = new byte[1024];

int len;

while ((len = fis.read(buf)) > 0) {

fos.write(buf, 0, len);

}

fis.close();

fos.close();

Toast.makeText(getApplicationContext(),

"The file is saved at :SD/Ultimate Entity Detector",Toast.LENGTH_LONG).show();

bmp1 = null;

camera_image.setImageBitmap(bmp1); //RESETING THE PREVIEW

camera.startPreview(); //RESETING THE PREVIEW

} catch (FileNotFoundException e) {

e.printStackTrace();

} catch (IOException e) {

e.printStackTrace();

}

}

private PictureCallback mPicture = new PictureCallback() { //THIS METHOD AND THE METHOD BELOW

//CONVERT THE CAPTURED IMAGE IN A JPG FILE AND SAVE IT

@Override

public void onPictureTaken(byte[] data, Camera camera) {

File dir_image2 = new File(Environment.getExternalStorageDirectory()+

File.separator+"Ultimate Entity Detector");

dir_image2.mkdirs(); //AGAIN CHOOSING FOLDER FOR THE PICTURE(WHICH IS LIKE A SURFACEVIEW

//SCREENSHOT)

File tmpFile = new File(dir_image2,"TempGhost.jpg"); //MAKING A FILE IN THE PATH

//dir_image2(SEE RIGHT ABOVE) AND NAMING IT "TempGhost.jpg" OR ANYTHING ELSE

try { //SAVING

FileOutputStream fos = new FileOutputStream(tmpFile);

fos.write(data);

fos.close();

//grabImage();

} catch (FileNotFoundException e) {

Toast.makeText(getApplicationContext(),"Error",Toast.LENGTH_LONG).show();

} catch (IOException e) {

Toast.makeText(getApplicationContext(),"Error",Toast.LENGTH_LONG).show();

}

String path = (Environment.getExternalStorageDirectory()+

File.separator+"Ultimate EntityDetector"+

File.separator+"TempGhost.jpg");//

BitmapFactory.Options options = new BitmapFactory.Options();//

options.inPreferredConfig = Bitmap.Config.ARGB_8888;//

bmp1 = BitmapFactory.decodeFile(path, options);//

//THE LINES ABOVE READ THE FILE WE SAVED BEFORE AND CONVERT IT INTO A BitMap

camera_image.setImageBitmap(bmp1); //SETTING THE BitMap AS IMAGE IN AN IMAGEVIEW(SOMETHING

//LIKE A BACKGROUNG FOR THE LAYOUT)

tmpFile.delete();

TakeScreenshot();//CALLING THIS METHOD TO TAKE A SCREENSHOT

//********* THAT LINE MIGHT CAUSE A CRASH ON SOME PHONES (LIKE XPERIA T)

//IF THAT HAPPENDS USE THE LINE "bmp1 =decodeFile(tmpFile);" WITH THE METHOD BELOW

}

};

public Bitmap decodeFile(File f) { //FUNCTION BY Arshad Parwez

Bitmap b = null;

try {

// Decode image size

BitmapFactory.Options o = new BitmapFactory.Options();

o.inJustDecodeBounds = true;

FileInputStream fis = new FileInputStream(f);

BitmapFactory.decodeStream(fis, null, o);

fis.close();

int IMAGE_MAX_SIZE = 1000;

int scale = 1;

if (o.outHeight > IMAGE_MAX_SIZE || o.outWidth > IMAGE_MAX_SIZE) {

scale = (int) Math.pow(

2,

(int) Math.round(Math.log(IMAGE_MAX_SIZE

/ (double) Math.max(o.outHeight, o.outWidth))

/ Math.log(0.5)));

}

// Decode with inSampleSize

BitmapFactory.Options o2 = new BitmapFactory.Options();

o2.inSampleSize = scale;

fis = new FileInputStream(f);

b = BitmapFactory.decodeStream(fis, null, o2);

fis.close();

} catch (IOException e) {

e.printStackTrace();

}

return b;

}

}

也试试这个

public static Bitmap overlay(Bitmap bmp1,Bitmap bmp2) {

Bitmap bmOverlay = Bitmap.createBitmap(bmp1.getWidth(), bmp1.getHeight(), bmp1.getConfig());

Canvas canvas = new Canvas(bmOverlay);

canvas.drawBitmap(bmp1, 0,0, null);

canvas.drawBitmap(bmp2, 0, 0, null);

Log.i("bmOverlay.......",""+bmOverlay);

bmp3=bmOverlay;

return bmOverlay;

}

private void getScreen() {

Toast.makeText(BookType1.this, "saved", Toast.LENGTH_SHORT).show();

File myDir=new File("/sdcard/saved_images");

myDir.mkdirs();

Random generator = new Random();

int n = 10000;

n = generator.nextInt(n);

String fname = "Image-"+ n +".png";

File file = new File (myDir, fname);

try

{

FileOutputStream ostream = new FileOutputStream(file);

bmp3.compress(CompressFormat.PNG, 100, ostream);

ostream.close();

}

catch (Exception e)

{

e.printStackTrace();

}

}

你也可以通过这些参考资料,给你更多的想法

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值