Как получить растровое изображение вида?

Хорошо, так что я постараюсь объяснить мою проблему. Я использовал этот код, чтобы получить "скриншот" моего 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;
} 
Другие вопросы по тегам