Android: как преобразовать вид в растровое изображение, не снимая фоновый экран - PullRequest
4 голосов
/ 08 декабря 2011

Для моего приложения я использовал функцию масштабирования пинч, адаптируясь из учебника и создавая пользовательский вид http://www.zdnet.com/blog/burnette/how-to-use-multi-touch-in-android-2-part-6-implementing-the-pinch-zoom-gesture/1847

Сейчас я работаю над захватом увеличенного изображения как растрового изображения.

Частично мне удалось получить растровое изображение, используя

setDrawingCacheEnabled(true);
Bitmap bm = Bitmap.createBitmap(finalView.getDrawingCache());
setDrawingCacheEnabled(false);

Используя этот подход, я получаю увеличенное изображение и фон экрана.

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

Ответы [ 3 ]

0 голосов
/ 09 декабря 2011

После долгих поисков я нашел «временное» решение в том же сообществе, а также спасибо за код от «слабого провода», представленный в том же посте.

Получение координат и ширины / высоты из матрицы

Идея проста, все, что мне нужно сделать, это удалить фоновый экран с масштабированного изображения путем обрезки. Код немного длинный, но у меня сработал.

  1. Сначала получите оригинальный размер растрового изображения

    float imgWidth = imgBitmap.getWidth()   
    float imgHeight = imgBitmap.getHeight()
    
  2. Получите значения матрицы (функция масштабирования пинча, используемая в моем приложении, использует матричный «трюк») значений, используемых для масштабирования изображения и получения scaledWidth & scaledHeight исходного изображения.

    float[] values = new float[9];
    matrix.getValues(values);
    float globalX = values[2];
    float globalY = values[5];
    float scaledWidth = values[0]*imgWidth;
    float scaledHeight = values[4]*imgHeight;   
    
    // If zoomed Image gets out of screen, I'm trying to crop the image available in the screen by considering image from (0,0)
    
    if(globalX<0)
    globalX = 0;
    
    if(globalY<0)
    globalY = 0;
    
  3. Наконец, захватить вид и обрезать фон В моем случае ("finalView" - это имя пользовательского представления, в котором происходит масштабирование)

    setDrawingCacheEnabled(false);
    destroyDrawingCache();
    finalView.setDrawingCacheEnabled(true);
    Bitmap bm = Bitmap.createBitmap(finalView.getDrawingCache());
    finalView.setDrawingCacheEnabled(false);    
    
    //Final Image Width &  Height
    
    int finalWidth = Math.min((int)width,(int)finalView.getWidth());
    int finalHeight = Math.min((int)height,(int)finalView.getHeight());        
    

    // обрезать, чтобы получить масштабированное изображение

     Bitmap finalBitmap = Bitmap.createBitmap(bm, (int)globalX, (int)globalY, finalWidth ,finalHeight);
    

Хотя это временное решение, оно работает для меня. Если есть какое-либо альтернативное решение, пожалуйста, опубликуйте его.

0 голосов
/ 03 сентября 2017

Этот оригинальный ответ здесь , просто замените настройку фоновой части.Надеюсь, это поможет

public static Bitmap getBitmapFromView(View view) {
    if (view == null) return null;
    //Define a bitmap with the same size as the view
    Bitmap returnedBitmap = Bitmap.createBitmap(view.getWidth(), view.getHeight(), Bitmap.Config.ARGB_8888);
    //Bind a canvas to it
    Canvas canvas = new Canvas(returnedBitmap);
    // draw white background on the canvas
    canvas.drawColor(Color.WHITE);
    // draw the view on the canvas
    view.draw(canvas);
    //return the bitmap
    return returnedBitmap;
}
0 голосов
/ 08 декабря 2011

Попробуйте

setDrawingCacheEnabled(false)
finalView.setDrawingCacheEnabled(true);
Bitmap bm = Bitmap.createBitmap(finalView.getDrawingCache());
finalView.setDrawingCacheEnabled(false);
...