'Saving a canvas larger than the physical screen
I'm dynamically drawing a some Image, Text through custom view where user can move text up/down left/right also zoom in/out but I would like to save the whole view as Image.I know I can save image but I need it to be in a higher resolution than the actual screen I'm capturing it on.
I am saving image using
File file = new File(imagePath);
try {
FileOutputStream out = new FileOutputStream(file, false);
if (parentView != null) {
parentView.setDrawingCacheEnabled(true);
Bitmap drawingCache = saveSettings.isTransparencyEnabled()
? BitmapUtil.removeTransparency(parentView.getDrawingCache())
: parentView.getDrawingCache();
drawingCache.compress(saveSettings.getCompressFormat(), saveSettings.getCompressQuality(), out);
}
out.flush();
out.close();
Log.d(TAG, "Filed Saved Successfully");
return null;
} catch (Exception e) {
FirebaseCrashlytics.getInstance().recordException(e);
e.printStackTrace();
Log.d(TAG, "Failed to save File");
return e;
}
Using above saving functionality image quality is very poor. I need to very high-resolution image.
Solution 1:[1]
Please try this way may help you
class MyActivity extends Activity {
private View rootLayoutContainerView;
private int imageWidth;
private int imageHeight;
private int screenLayoutWidth;
private int screenLayoutHeight;
public final void nextToOverlay() {
Bitmap result = Bitmap.createBitmap(this.screenLayoutWidth, this.screenLayoutHeight, Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(result);
rootLayoutContainerView.draw(canvas);
result = resizeBitmapFitXY(imageWidth, imageHeight, result);
ByteArrayOutputStream bytes = new ByteArrayOutputStream();
result.compress(Bitmap.CompressFormat.PNG, 100, bytes);
File file = getimagePath((Context)this, "framelayer");
try {
FileOutputStream fo = new FileOutputStream(file);
fo.write(bytes.toByteArray());
fo.flush();
fo.close();
} catch (IOException var6) {
var6.printStackTrace();
}
}
public final Bitmap resizeBitmapFitXY(int width, int height,Bitmap bitmap) {
Bitmap background = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
float originalWidth = (float)bitmap.getWidth();
float originalHeight = (float)bitmap.getHeight();
Canvas canvas = new Canvas(background);
float scale = 0.0F;
float xTranslation = 0.0F;
float yTranslation = 0.0F;
if (originalWidth > originalHeight) {
scale = (float)height / originalHeight;
xTranslation = ((float)width - originalWidth * scale) / 2.0F;
} else {
scale = (float)width / originalWidth;
yTranslation = ((float)height - originalHeight * scale) / 2.0F;
}
Matrix transformation = new Matrix();
transformation.postTranslate(xTranslation, yTranslation);
transformation.preScale(scale, scale);
Paint paint = new Paint();
paint.setFilterBitmap(true);
canvas.drawBitmap(bitmap, transformation, paint);
return background;
}
public File getimagePath(Context context,String name) {
File mTranscodeOutputFile = null;
try {
File outputDir = new File(context.getExternalFilesDir(null), "image");
if (!outputDir.exists()) {
outputDir.mkdir();
}
mTranscodeOutputFile = new File(outputDir, name + ".jpg");
} catch (Exception var5) {
}
return mTranscodeOutputFile;
}
}
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|---|
| Solution 1 | gpuser |
