Android使用ZXing生成帶圖片的二維碼


效果圖如下:

制作過程很簡單的就是在原始的二維碼圖片上添加一個logn圖標,代碼的注釋寫得很詳細,也就不給大家啰嗦了

package com.example.day44_02_qrcodewithlogin;

import java.util.HashMap;
import java.util.Map;

import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.Bitmap.Config;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.os.Bundle;
import android.view.Menu;
import android.widget.ImageView;

import com.google.zxing.BarcodeFormat;
import com.google.zxing.EncodeHintType;
import com.google.zxing.WriterException;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.qrcode.QRCodeWriter;

public class MainActivity extends Activity {
    private ImageView imageView_main ;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		initView();
	}

	private void initView() {
		imageView_main = (ImageView) findViewById(R.id.imageView_main);
		String content = "我們要畢業了";
		createQRCode(content,500,500);
	}
    
	/**
	 * 用於創建一個二維碼
	 * @param content
	 * @param width
	 * @param height
	 */
	private void createQRCode(String content, int width, int height) {
		
		try {
			//1,創建實例化對象
			QRCodeWriter writer = new QRCodeWriter() ;
			//2,設置字符集
			Map<EncodeHintType, String>  map = new HashMap<EncodeHintType, String>();
			map.put(EncodeHintType.CHARACTER_SET, "UTF-8");
			//3,通過encode方法將內容寫入矩陣對象
			BitMatrix matrix = writer.encode(content, BarcodeFormat.QR_CODE, width, height,map);
		    //4,定義一個二維碼像素點的數組,向每個像素點中填充顏色
			int[] pixels = new int[width*height];
		    //5,往每一像素點中填充顏色(像素沒數據則用黑色填充,沒有則用彩色填充,不過一般用白色)
			for (int i = 0; i < height; i++) {
				for (int j = 0; j < width; j++) {
					if (matrix.get(j, i)) {
						pixels[i*width+j] = 0xff000000;
					}else {
						pixels[i*width+j] = 0xffffffff;
					}
				}
			}
			//6,創建一個指定高度和寬度的空白bitmap對象
			Bitmap bm_QR = Bitmap.createBitmap(width, height, Config.ARGB_8888);
		    //7,將每個像素的顏色填充到bitmap對象
			bm_QR.setPixels(pixels, 0, width, 0, 0, width, height);
			
			//8,創建一個bitmap對象用於作為其圖標
			Bitmap bm_login = BitmapFactory.decodeResource(getResources(), R.drawable.img_kf_qq);
			//9,創建一個方法在二維碼上添加一張圖片
			if (addLogin(bm_QR,bm_login) != null) {
				imageView_main.setImageBitmap(addLogin(bm_QR,bm_login));
			}
	
			
		} catch (WriterException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		
	}

	
	/**
	 * 用於向創建的二維碼中添加一個logn
	 * @param bm_QR
	 * @param bm_login
	 * @return
	 */
	private Bitmap addLogin(Bitmap bm_QR, Bitmap bm_login) {
		if (bm_QR == null) {
			return null;
		}
		if (bm_login == null) {
			return bm_QR ;
		}
		
		//獲取圖片的寬高
		int bm_QR_Width = bm_QR.getWidth() ;
		int bm_QR_Height = bm_QR.getHeight();
		int bm_login_Width = bm_login.getWidth() ;
		int bm_login_Height = bm_login.getHeight();
		
		//設置logn的大小為二維碼整體大小的1/5
		float scale_login = bm_QR_Width*1.0f /5/bm_login_Width ;
		Bitmap bitmap = Bitmap.createBitmap(bm_QR_Width, bm_QR_Height, Bitmap.Config.ARGB_8888);
	    
		 try {
	            Canvas canvas = new Canvas(bitmap);
	            canvas.drawBitmap(bm_QR, 0, 0, null);
	            canvas.scale(scale_login, scale_login, bm_QR_Width / 2, bm_QR_Height / 2);
	            canvas.drawBitmap(bm_login, (bm_QR_Width - bm_login_Width) / 2, (bm_QR_Height - bm_login_Height) / 2, null);
	 
	            canvas.save(Canvas.ALL_SAVE_FLAG);
	            canvas.restore();
	        } catch (Exception e) {
	            bitmap = null;
	            e.getStackTrace();
	        }
	 
	        return bitmap;
	  
	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		getMenuInflater().inflate(R.menu.main, menu);
		return true;
	}

}

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM