تبدیل view به bitmap در اندروید


چگونه در اندروید یک view را به bitmap تبدیل کنیم؟

تبدیل view به bitmap در بسیاری از برنامه های اندرویدی می تواند کاربرد داشته باشد. گاهی نیاز به استفاده خاصی از view داریم که فقط با تبدیل view به bitmap ممکن می شود. در چه مواردی؟ تا زمانی که به آن نیاز پیدا نکنید نمی توان گفت. اما شاید به عنوان یک نمونه کلی بتوان به حالتی اشاره کرد که کاربر می تواند در برنامه view های مختلف را شخصی سازی کند و بتواند آنها را به اشتراک گذارد. مثل شخصی سازی تم برنامه و ساخت یک نمای کلی از آن. برای چنین کاری به تبدیل view به bitmap نیاز داریم.

پیاده سازی با () View.getDrawingCache

به عنوان اولین راه برای تبدیل view به bitmap از این متد استفاده کردم. اما مشکل این روش منسوخ بودن متدهای مربوطه برای اندروید 9 به بالاست. چیزی شبیه به قطعه کد زیر که بطور کلی به درستی کار می کند اما برای api 28 به بعد deprecate شده است.

/**
    * Creates a bitmap from the supplied view.
    *
    * @param view The view to get the bitmap.
    * @param width The width for the bitmap.
    * @param height The height for the bitmap.
    *
    * @return The bitmap from the supplied drawable.
    */
   public @NonNull static Bitmap createBitmapFromView(@NonNull View view, int width, int height) {
       if (width > 0 && height > 0) {
           view.measure(View.MeasureSpec.makeMeasureSpec(DynamicUnitUtils
                           .convertDpToPixels(width), View.MeasureSpec.EXACTLY),
                   View.MeasureSpec.makeMeasureSpec(DynamicUnitUtils
                           .convertDpToPixels(height), View.MeasureSpec.EXACTLY));
       }

       view.layout(0, 0, view.getMeasuredWidth(), view.getMeasuredHeight());
       view.setDrawingCacheEnabled(true);
       view.buildDrawingCache(true);
       Bitmap bitmap = Bitmap.createBitmap(view.getDrawingCache());
       view.setDrawingCacheEnabled(false);

       return bitmap;
   }

Canvas

با توجه به deprecate شدن متدهای drawingCache، استفاده از canvas ها برای نسخه های اندروید 9 به بالا جوابگوست. قطعه کد زیر را در نظر بگیرید:

/**
     * Creates a bitmap from the supplied view.
     *
     * @param view The view to get the bitmap.
     * @param width The width for the bitmap.
     * @param height The height for the bitmap.
     *
     * @return The bitmap from the supplied drawable.
     */
    public @NonNull static Bitmap createBitmapFromView(@NonNull View view, int width, int height) {
        if (width > 0 && height > 0) {
            view.measure(View.MeasureSpec.makeMeasureSpec(DynamicUnitUtils
                            .convertDpToPixels(width), View.MeasureSpec.EXACTLY),
                    View.MeasureSpec.makeMeasureSpec(DynamicUnitUtils
                            .convertDpToPixels(height), View.MeasureSpec.EXACTLY));
        }
        view.layout(0, 0, view.getMeasuredWidth(), view.getMeasuredHeight());

        Bitmap bitmap = Bitmap.createBitmap(view.getMeasuredWidth(),
                view.getMeasuredHeight(), Bitmap.Config.ARGB_8888);
        Canvas canvas = new Canvas(bitmap);
        Drawable background = view.getBackground();

        if (background != null) {
            background.draw(canvas);
        }
        view.draw(canvas);

        return bitmap;
    }

برای پاس دادن مقدار طول یا عرض از صفر استفاده شده تا ابعاد فعلی view در نظر گرفته شود. متد convertDptoPixel می تواند چیزی شبیه متد زیر باشد:

public static int convertDpToPixels(float dp) {
        return Math.round(TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,
                dp, Resources.getSystem().getDisplayMetrics()));
    }

خروجی هر دو روش یکسان است اما پیشنهاد می شود برای تبدیل view به bitmap از canvas استفاده شود. چرا که روش اول در نسخه های آتی اندروید ممکن است اصلا کار نکند.

PixelCopy

روش دیگر برای اندروید 7 به بالا (+API 24) که به کمک آن می توان از UI اسکرین شات گرفت، استفاده از PixelCopy ست. این روش تا حدی پیچیده ست و من در پروژه ای استفاده نکرده ام. می توانید به document های موجود مراجعه کنید.

کتابخانه DynamicUtils

این کتابخانه برای اندروید 4 به بالا قابل استفاده است. به کمک DynamicUtils می توانید با متدهای استاتیک آن، روی عملیات رنگ، ابعاد، drawings و موارد دیگر کنترل بیشتری داشته باشید. برای آشنایی با این متدها و امکانات کتابخانه می توانید این لینک را مطالعه نمایید.

به این پست امتیاز دهید

روی ستاره های کلیک کنید و امتیاز بدید

میانگین امتیاز / 5. تعداد:

2 دیدگاه در نوشته: “تبدیل view به bitmap در اندروید

  1. زهرا گفت:

    سلام
    مترجم خوبی هستی
    ولی بهتره خودت این موارد رو یاد داشته باشی و بهتر توضیح بدی

    1. نسیم نژند گفت:

      سلام
      در چنین مقاله ای فرض می شود که خواننده با bitmap و canvas و مواردی از این قبیل آشنایی داشته که به مشکل تبدیل view به bitmap برخورده. بنابراین توضیح همه ی این موارد در یک مقاله معقول نیست.
      همه مقالات حاصل خوانش مقالات دیگر، جستجو در stackoverflow و ویدئوهای یوتیوب است.
      هیچ کدام از مقالات صرفا یکی از اینها نبوده که ترجمه ی فرد مد نظر باشد.
      من مترجم نیستم و صرفا سعی کردم به مشکلی که در یکی از پروژه ها برخوردم بپردازم.

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *




Enter Captcha Here : *

Reload Image