在android中以编程方式拍摄屏幕截图
我使用以下代码以编程方式拍摄屏幕截图:在android中以编程方式拍摄屏幕截图,android,screenshot,Android,Screenshot,我使用以下代码以编程方式拍摄屏幕截图: public static Bitmap takeScreenshot(View view) { try { // create bitmap screen capture view.setDrawingCacheEnabled(true); Bitmap bitmap = Bitmap.createBitmap(view.getDrawingC
public static Bitmap takeScreenshot(View view)
{
try
{
// create bitmap screen capture
view.setDrawingCacheEnabled(true);
Bitmap bitmap = Bitmap.createBitmap(view.getDrawingCache());
view.setDrawingCacheEnabled(false);
return bitmap;
}
catch (Throwable e)
{
CustomLogHandler.printError(e);
}
return null;
}
private static void copyFile(Bitmap bitmap)
{
File dstFile = getShareResultFile();
//Delete old file if exist.
if(dstFile.exists()) {
dstFile.delete();
}
FileOutputStream fos = null;
try
{
fos = new FileOutputStream(dstFile);
bitmap.compress(Bitmap.CompressFormat.JPEG, 0, fos);
fos.flush();
}
catch (Exception e) {
CustomLogHandler.printError(e);
}
finally {
if (fos != null) {
try {
fos.close();
} catch (IOException ioe) {
CustomLogHandler.printError(ioe);
}
}
}
}
存在以下几个问题:
@param quality Hint to the compressor, 0-100. 0 meaning compress for
* small size, 100 meaning compress for max quality. Some
* formats, like PNG which is lossless, will ignore the
* quality setting
只需使用Ctrl键并单击方法名称即可阅读有关参数的文档
答案设置为第二个参数100而不是0
bitmap.compress(Bitmap.CompressFormat.JPEG, 0, fos);
首先,您要将其保存为JPEG格式。JPEG是为照片设计的,而您的屏幕截图不是照片
第二,您正在以质量因子0保存此项。JPEG使用有损压缩算法,质量因子为0表示“请随意使此图像变得非常糟糕,但尽可能压缩它”
我建议改为:
bitmap.compress(Bitmap.CompressFormat.PNG, 100, fos);
PNG是一种更好的屏幕截图图像格式,其中包含问题中显示的内容。我不认为PNG使用质量因子值;我输入100只是为了表明你想要最好的质量。试试这个
private void captureScreen() {
View v = this.getWindow().getDecorView().findViewById(android.R.id.content);
v.setDrawingCacheEnabled(true);
Bitmap bitmap = v.getDrawingCache();
String extr = Environment.getExternalStorageDirectory().toString();
File file = new File(extr, getString(R.string.free_tiket) + ".jpg");
FileOutputStream f = null;
try {
f = new FileOutputStream(file);
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, f);
f.flush();
f.close();
MediaStore.Images.Media.insertImage(getContentResolver(), bitmap, "Screen", "screen");
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
尝试使用以下方法:
public static Bitmap loadBitmapFromView(Context context, View v) {
DisplayMetrics dm = context.getResources().getDisplayMetrics();
v.measure(MeasureSpec.makeMeasureSpec(dm.widthPixels, MeasureSpec.EXACTLY),
MeasureSpec.makeMeasureSpec(dm.heightPixels, MeasureSpec.EXACTLY));
v.layout(0, 0, v.getMeasuredWidth(), v.getMeasuredHeight());
Bitmap returnedBitmap = Bitmap.createBitmap(v.getMeasuredWidth(),
v.getMeasuredHeight(), Bitmap.Config.ARGB_8888);
Canvas c = new Canvas(returnedBitmap);
v.draw(c);
return returnedBitmap;
}
及
图像保存在外部存储文件夹中。请编辑您的问题,并显示您使用此
位图所做的操作。例如,您是否使用compress()
将其写入磁盘?您是指以编程方式?@Merka以编程方式我是指使用代码。现在我想大家都明白了。“但你为什么投反对票?”——我没有投你的问题的赞成票或反对票。“我正在使用bitmap.compress保存到外部存储”--那么您的问题很可能就在那里。请编辑您的问题并显示您正在使用的代码compress()
。如果您正在压缩质量为0的JPG,请将其更改为90或100。即使它不能解决你的问题,它肯定会有帮助。bitmap.compress(bitmap.CompressFormat.JPEG,90,fos);使用100%的质量解决了我的1分、2分和3分。静止背景图像未出现。它是简单的纯黑色。你是对的,问题是保存文件。使用100%的质量解决了我的1分、2分和3分。静止背景图像未出现。它采用简单的纯黑色。而且JPG格式的图像质量比png好,我也很惊讶为什么会这样。@Smeet:我不确定你的问题中“父布局”是什么意思。如果此背景未直接在传递给takeScreenshot()
方法的视图
上实现(或在该视图
的子视图上实现),则它不可能出现在您的图像中。请注意,依赖图形缓存不是一个好的计划;我建议创建一个位图背景画布
,并告诉您的视图
在画布
上绘制()
;我建议您创建一个以位图为背景的画布,并告诉您的视图在该画布上绘制()-您能建议相同的代码或链接吗?窗口背景与“活动”中的任何视图无关,它与“活动”本身有关。将背景置于视图层次结构中,如
public static Bitmap loadBitmapFromView(Context context, View v) {
DisplayMetrics dm = context.getResources().getDisplayMetrics();
v.measure(MeasureSpec.makeMeasureSpec(dm.widthPixels, MeasureSpec.EXACTLY),
MeasureSpec.makeMeasureSpec(dm.heightPixels, MeasureSpec.EXACTLY));
v.layout(0, 0, v.getMeasuredWidth(), v.getMeasuredHeight());
Bitmap returnedBitmap = Bitmap.createBitmap(v.getMeasuredWidth(),
v.getMeasuredHeight(), Bitmap.Config.ARGB_8888);
Canvas c = new Canvas(returnedBitmap);
v.draw(c);
return returnedBitmap;
}
public void takeScreen() {
Bitmap bitmap = ImageUtils.loadBitmapFromView(this, view); //get Bitmap from the view
String mPath = Environment.getExternalStorageDirectory() + File.separator + "screen_" + System.currentTimeMillis() + ".jpeg";
File imageFile = new File(mPath);
OutputStream fout = null;
try {
fout = new FileOutputStream(imageFile);
bitmap.compress(Bitmap.CompressFormat.JPEG, 90, fout);
fout.flush();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
fout.close();
}
}