Android通過(guò)View生成Bitmap

已測(cè)量過(guò)的View生成Bitmap

即經(jīng)過(guò)測(cè)量、布局、繪制并顯示在界面上的View,此類(lèi)View無(wú)需再次進(jìn)行測(cè)量和布局,可直接將內(nèi)容繪制到指定的Bitmap上。

/**
 * 繪制已經(jīng)測(cè)量過(guò)的View
 */
private static Bitmap drawMeasureView(View view) {
    int width = view.getWidth();
    int height = view.getHeight();
    Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.RGB_565);
    Canvas canvas = new Canvas(bitmap);
    view.draw(canvas);
    return bitmap;
}

未測(cè)量過(guò)的View生成Bitmap

直接Inflate后并未顯示在界面的View,此類(lèi)View必須手動(dòng)進(jìn)行測(cè)量和布局后,方可進(jìn)行繪制,否則獲取不到對(duì)應(yīng)的寬高和內(nèi)容。

/**
 * 先測(cè)量和布局,再生成Bitmap
 */
public static Bitmap getBitmap(View view) {
    // 測(cè)量
    int widthSpec = View.MeasureSpec.makeMeasureSpec(screenWidth, View.MeasureSpec.AT_MOST);
    int heightSpec = View.MeasureSpec.makeMeasureSpec(screenHeight, View.MeasureSpec.AT_MOST);
    view.measure(widthSpec, heightSpec);
    // 布局
    int measuredWidth = view.getMeasuredWidth();
    int measuredHeight = view.getMeasuredHeight();
    view.layout(0, 0, measuredWidth, measuredHeight);
    // 繪制
    int width = view.getWidth();
    int height = view.getHeight();
    Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.RGB_565);
    Canvas canvas = new Canvas(bitmap);
    view.draw(canvas);
    return bitmap;
}

多張Bitmap合并為一張

將多張Bitmap按順序從上到下合并為一張,如果圖片的寬度不同,則進(jìn)行等比縮放后再進(jìn)行合并繪制。

/**
 * 將用戶輸入的圖片從上到下拼接到一起
 * 如果圖片寬度不一致,則進(jìn)行等比縮放后再拼接
 */
public static Bitmap concat(Bitmap... bitmaps) {
    // 獲取圖片的最大寬度
    int maxWidth = bitmaps[0].getWidth();
    for (Bitmap bitmap : bitmaps) {
        maxWidth = Math.max(maxWidth, bitmap.getWidth());
    }
    // 對(duì)圖片進(jìn)行縮放并計(jì)算拼接后的圖片高度
    int totalHeight = 0;
    for (int i = 0; i < bitmaps.length; i++) {
        Bitmap bitmap = bitmaps[i];
        int width = bitmap.getWidth();
        int height = bitmap.getHeight();
        float scale = maxWidth * 1f / width;
        int scaleHeight = (int) (height * scale);
        totalHeight = totalHeight + scaleHeight;
        bitmaps[i] = Bitmap.createScaledBitmap(bitmap, maxWidth, scaleHeight, false);
    }
    // 從上到下依次拼接
    Bitmap newBitmap = Bitmap.createBitmap(maxWidth, totalHeight, Bitmap.Config.RGB_565);
    Canvas canvas = new Canvas(newBitmap);
    int offsetTop = 0;
    for (Bitmap bitmap : bitmaps) {
        int height = bitmap.getHeight();
        canvas.drawBitmap(bitmap, 0, offsetTop, null);
        offsetTop += height;
    }
    return newBitmap;
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容