bitmap+文本生成新的bitmap的實現

来源:https://www.cnblogs.com/xqxacm/archive/2020/01/16/12200183.html
-Advertisement-
Play Games

註:參數content為生成二維碼bitmap的內容,該二維碼bitmap在和文本title組合生成一個新的bitmap ...


  

註:參數content為生成二維碼bitmap的內容,該二維碼bitmap在和文本title組合生成一個新的bitmap

 

package info.ecloud.merchant.util;

import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Rect;

import com.google.zxing.BarcodeFormat;
import com.google.zxing.EncodeHintType;
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;
import com.journeyapps.barcodescanner.BarcodeEncoder;

import java.util.Hashtable;



public class SaveImageUtils {

    private static final String CHARSET = "UTF-8";
    /**
     * 生成圖片  加上title的圖片
     * @param content
     * @param title
     * @return
     */
    public static Bitmap createImage(String content,String title) {
        int picWidth = 520;//生成圖片的寬度
        int picHeight = 565;//生成圖片的高度
        int titleTextSize = 25;
        int textColor = Color.BLACK;
        int qrWidth = 370;
        int qrHeight = 370;
        int paddingTop = 5;
        int paddingMiddle = 20;
        int paddingBottom = 20;

        //最終生成的圖片
        Bitmap result = Bitmap.createBitmap(picWidth,picHeight,Bitmap.Config.ARGB_8888);

        Paint paint = new Paint();
        paint.setColor(Color.WHITE);
        Canvas canvas = new Canvas(result);

        //先畫一整塊白色矩形塊
        canvas.drawRect(0,0,picWidth,picHeight,paint);

        //畫title文字
        Rect bounds = new Rect();
        paint.setColor(textColor);
        paint.setTextSize(titleTextSize);
        //獲取文字的字寬高,以便將文字與圖片中心對齊
        paint.getTextBounds(title,0,title.length(),bounds);
        //畫白色矩形塊
        int qrTop = paddingTop+titleTextSize+paddingMiddle;//二維碼的頂部高度

        //畫二維碼
        Hashtable<EncodeHintType, Object> hints = new Hashtable<>();
        hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);
        hints.put(EncodeHintType.CHARACTER_SET, CHARSET);
        hints.put(EncodeHintType.MARGIN, 5);
        Bitmap image = null;
        try {
            BarcodeEncoder barcodeEncoder = new BarcodeEncoder();
            image = barcodeEncoder.encodeBitmap((String) content, BarcodeFormat.QR_CODE, 400, 400);
        } catch (Exception e) {
            e.printStackTrace();
        }

        paint.setColor(Color.BLACK);
        canvas.drawBitmap(image,(picWidth-qrWidth)/2,qrTop,paint);

        //畫文字
        paint.setColor(Color.BLACK);
        paint.setTextSize(titleTextSize);
        int line = 3;
        int textTop = qrTop+qrHeight+paddingBottom;//地址的頂部高度

        for (int i = 0 ; i < line ; i++){
            String[] split = title.split("-");
            paint.getTextBounds(title,0,split[i].length(),bounds);
            canvas.drawText(split[i],picWidth/2-bounds.width()/2,textTop+i*titleTextSize+i*5+bounds.height()/2,paint);
        }

        canvas.save();
        canvas.restore();

        return result;
    }


}

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • oracle 12.2 RAC監聽日誌報錯:15-JAN-2020 22:27:53 * (CONNECT_DATA=(COMMAND=VERSION)) * version * 1189TNS-01189: The listener could not authenticate the user ...
  • 引用 https://www.cnblogs.com/qingyunzong/p/8744593.html#_label0 官方文檔 https://cwiki.apache.org/confluence/display/Hive/LanguageManual+UDF 目錄 數學函數 集合函數 類型 ...
  • 環境:SQL 2016; 語句 select * from A where PID=JoID 上述查詢語句中的Where PID=JoID條件中PID的欄位類型為varchar(50)而JoID的欄位類型為uniqueidentifier,該寫法在升級之前的(SQL2012)庫上沒有問題,但在新庫( ...
  • 問題描述:現場一臺測試伺服器,安裝有oracle11g(11.2.0.1),上午還運行正常,結果下午直接訪問不了,提示錯誤:ora-12541 無監聽程式問題。問題排查:按照常規方法,重啟監聽程式以及資料庫、重新配置監聽程式均無作用,後來發現是listener.log日誌文件過大(達到4G,據說這是... ...
  • 利用空閑時間花幾分鐘回顧一下 7.1 檢索數據 為了查詢出資料庫表中的行(數據),使用SELECE語句。 格式: 第一種寫法使用\ 通配符,會把表中行的列全部查詢出來,而不必取一一列出全部列。但是不推薦使用,這跟INSERT語句的規範寫法一樣。 使用\ 通配符,列的順序一般是列在表定義中出現的順序, ...
  • 最近在自學看 資料庫系統概論 這本書,總結一下遇到的問題。 1.廣義笛卡爾積(Extende cartesian product): 屬於 關係代數 裡面的 傳統的集合運算。其他的為union,except,intersection. 詳情不提了,舉個例子就是: create table R(A c ...
  • 個人博客 "http://www.milovetingting.cn" 位運算的簡單應用 許可權管理 位運算在實際的開發中,有很多巧妙的應用場景。如: 1. 一個存放正整數的數組,裡面有一個數字只出現一次,其它數字都出現兩次,求只出現一次的數字。 2. 不用臨時變數,交換兩個數字的值。 3. Andr ...
  • 打開項目文件夾下 'node_modules/react native/local cli/runIOS/findMatchingSimulator.js' 查找 修改為 查找 修改為 原方法地址 https://github.com/facebook/react native/issues/214 ...
一周排行
    -Advertisement-
    Play Games
  • Timer是什麼 Timer 是一種用於創建定期粒度行為的機制。 與標準的 .NET System.Threading.Timer 類相似,Orleans 的 Timer 允許在一段時間後執行特定的操作,或者在特定的時間間隔內重覆執行操作。 它在分散式系統中具有重要作用,特別是在處理需要周期性執行的 ...
  • 前言 相信很多做WPF開發的小伙伴都遇到過表格類的需求,雖然現有的Grid控制項也能實現,但是使用起來的體驗感並不好,比如要實現一個Excel中的表格效果,估計你能想到的第一個方法就是套Border控制項,用這種方法你需要控制每個Border的邊框,並且在一堆Bordr中找到Grid.Row,Grid. ...
  • .NET C#程式啟動閃退,目錄導致的問題 這是第2次踩這個坑了,很小的編程細節,容易忽略,所以寫個博客,分享給大家。 1.第一次坑:是windows 系統把程式運行成服務,找不到配置文件,原因是以服務運行它的工作目錄是在C:\Windows\System32 2.本次坑:WPF桌面程式通過註冊表設 ...
  • 在分散式系統中,數據的持久化是至關重要的一環。 Orleans 7 引入了強大的持久化功能,使得在分散式環境下管理數據變得更加輕鬆和可靠。 本文將介紹什麼是 Orleans 7 的持久化,如何設置它以及相應的代碼示例。 什麼是 Orleans 7 的持久化? Orleans 7 的持久化是指將 Or ...
  • 前言 .NET Feature Management 是一個用於管理應用程式功能的庫,它可以幫助開發人員在應用程式中輕鬆地添加、移除和管理功能。使用 Feature Management,開發人員可以根據不同用戶、環境或其他條件來動態地控制應用程式中的功能。這使得開發人員可以更靈活地管理應用程式的功 ...
  • 在 WPF 應用程式中,拖放操作是實現用戶交互的重要組成部分。通過拖放操作,用戶可以輕鬆地將數據從一個位置移動到另一個位置,或者將控制項從一個容器移動到另一個容器。然而,WPF 中預設的拖放操作可能並不是那麼好用。為瞭解決這個問題,我們可以自定義一個 Panel 來實現更簡單的拖拽操作。 自定義 Pa ...
  • 在實際使用中,由於涉及到不同編程語言之間互相調用,導致C++ 中的OpenCV與C#中的OpenCvSharp 圖像數據在不同編程語言之間難以有效傳遞。在本文中我們將結合OpenCvSharp源碼實現原理,探究兩種數據之間的通信方式。 ...
  • 一、前言 這是一篇搭建許可權管理系統的系列文章。 隨著網路的發展,信息安全對應任何企業來說都越發的重要,而本系列文章將和大家一起一步一步搭建一個全新的許可權管理系統。 說明:由於搭建一個全新的項目過於繁瑣,所有作者將挑選核心代碼和核心思路進行分享。 二、技術選擇 三、開始設計 1、自主搭建vue前端和. ...
  • Csharper中的表達式樹 這節課來瞭解一下表示式樹是什麼? 在C#中,表達式樹是一種數據結構,它可以表示一些代碼塊,如Lambda表達式或查詢表達式。表達式樹使你能夠查看和操作數據,就像你可以查看和操作代碼一樣。它們通常用於創建動態查詢和解析表達式。 一、認識表達式樹 為什麼要這樣說?它和委托有 ...
  • 在使用Django等框架來操作MySQL時,實際上底層還是通過Python來操作的,首先需要安裝一個驅動程式,在Python3中,驅動程式有多種選擇,比如有pymysql以及mysqlclient等。使用pip命令安裝mysqlclient失敗應如何解決? 安裝的python版本說明 機器同時安裝了 ...