Как получить растровое изображение вида?
Хорошо, так что я постараюсь объяснить мою проблему. Я использовал этот код, чтобы получить "скриншот" моего FrameLayout
/**
* Function that takes a screenshot of the view passed and returns a bitmap for it.
*
* @param view {@link View}
* @return screenshot of the view passed
*/
public Bitmap screenShot(View view) {
Bitmap bitmap = Bitmap.createBitmap(view.getWidth(),
view.getHeight(), Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(bitmap);
view.draw(canvas);
return bitmap;
}
Вот мой FrameLayout
<FrameLayout
android:id="@+id/frame_layout_picture"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<ImageView
android:id="@+id/photoImageView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scaleType="fitCenter" />
<com.my.android.util.DrawCustomView
android:id="@+id/draw_custom_view"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</FrameLayout>
DrawCustomView
используется для рисования на photoImageView
,
Теперь у меня также есть другая активность, чтобы обрезать изображение. Итак, я сохранил это растровое изображение (используя screenshot(view)
) в файле и отправьте путь к файлу для этого действия обрезки. В своей культуре я использую библиотеки https://github.com/ArthurHub/Android-Image-Cropper CropImageView
обрезать изображение. Когда я пытаюсь обрезать нарисованное фото, отправленное на обрезку, я получаю странный урожай, что-то вроде этого
Изображение слишком сильно удваивается при кадрировании: https://drive.google.com/open?id=0B4jK5QX65b0ZSHdMTWIzZXluZXc
Перед увеличением: https://drive.google.com/open?id=0B4jK5QX65b0ZeUk3NUlGUHRSQ0E
Вот как в кадре появляется нормальное изображение: https://drive.google.com/open?id=0B4jK5QX65b0ZNk9oSG1ZaGxYOVk
Я также заметил, что границы для обрезки ограничены размером изображения в обычном случае, но при редактировании с помощью screenshot(), границы принимают размер экрана.
Я заранее проверил свою урожайность, и она отлично работает для изображений, отправленных с камеры. Я также попытался отправить изображение, которое не было получено с помощью функции скриншота, и оно отлично работало в процессе обрезки.
Я буду рад предоставить больше информации, любая помощь очень ценится... Я относительно новичок в разработке Android:)
РЕДАКТИРОВАТЬ
Это видео может дать более полное представление о проблеме https://drive.google.com/open?id=0B4jK5QX65b0ZSUVFZDlQeTc4QnM
2 ответа
Вы можете попробовать этот метод, чтобы сделать снимок экрана вашего представления.
/**
* this method capture the image from provided view and save it to application internal directory.
*
* @param view to capture image.
* @return path of image saved in the phone.
*/
public static String captureScreenShotAndSave(Context mContext, View view) {
view.setBackgroundColor(Color.WHITE);
String mPath = mContext.getApplicationContext().getExternalCacheDir() + "/" + "IMG_" + DateTimeUtils.getCurrentTimeStamp() + "_" + SHARE_IMAGE_NAME;
Bitmap bitmap = Bitmap.createBitmap(view.getMeasuredWidth(), view.getMeasuredHeight(), Bitmap.Config.ARGB_8888);
Canvas c = new Canvas(bitmap);
view.draw(c);
c.drawBitmap(bitmap, 0, 0, null);
OutputStream fout = null;
File imageFile = new File(mPath);
try {
fout = new FileOutputStream(imageFile);
bitmap.compress(Bitmap.CompressFormat.JPEG, 80, fout);//set image quality and formate as you required.
fout.flush();
fout.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return imageFile.getAbsolutePath();
}
Вы можете назвать этот метод как YourUtilsClass.captureScreenShotAndSave(mContext, mViewToCapture);
public static Bitmap shot(View view) {
view.setDrawingCacheEnabled(true);
Bitmap bitmap = view.getDrawingCache();
view.setDrawingCacheEnabled(false);
return bitmap;
}