帶動態背景圖的二維碼生成器
BitQR-Code
Through image generate QR-Code .
一個優雅的 QR 二維碼生成器
Github專案地址 : https://github.com/CasterWx/BitQR-Code
樣例
拿起你的手機掃描下面的二維碼試試吧!
原圖 | Version-3 | |
---|---|---|
| Version-5 | 直接拼湊GIF | 分解生成 |
| ———— | ————- | ———— |
| | | |
原圖1 | 原圖2 | 原圖3 | |
---|---|---|---|
GIF1 | GIF2 | GIF3 |
---|---|---|
GIF分解為多個幀
原GIF | 第四幀 | 第七幀 | 第十幀 |
---|---|---|---|
第十三幀 | 第十六幀 | 第二十幀 | 生成GIF |
---|---|---|---|
2018年最後一天的最後一篇
引用
在專案中匯入 QRCode.jar 以新增依賴:
<component name="libraryTable">
<library name="QRCode">
<CLASSES>
<root url="jar://$PROJECT_DIR$/src/lib/QRCode.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</component>
快速上手
1. “快速匯入背景圖片”
只想顯示一張麻衣學姐的照片
BufferedImage writeImg = ImageIO.read(new File("麻衣學姐.jpg"));
BufferedImage bf = new BufferedImage(writeImg.getWidth(),writeImg.getHeight(),BufferedImage.TYPE_INT_RGB);
Graphics2D gs = bf.createGraphics() ;
gs.clearRect(0,0,bf.getWidth(),bf.getHeight());
gs.drawImage(writeImg,0,0,bf.getWidth(),bf.getHeight(),null);
writeImg是讀取到的圖片,然後根據這張照片建立Graphics的大小。
gs.drawImage(writeImg,0,0,bf.getWidth(),bf.getHeight(),null);
便可以將writeImg繪製到Graphics中了。
File imagefile = new File(imgPath);
ImageIO.write(bf,"png",imagefile);
現在就可以利用ImageIO將圖片儲存到本地了
效果 |
---|
2. “圖片中使用畫筆”
Graphics2D gs = bf.createGraphics() ;
gs.setBackground(Color.white);
gs.clearRect(0,0,bf.getWidth(),bf.getHeight());
gs.drawImage(writeImg,0,0,bf.getWidth(),bf.getHeight(),null);
gs是建立出的畫布,setBackground可以設定其背景色,也可以直接drawImage()將圖片繪製進去。
gs.setColor(Color.BLACK);
gs.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP,1.0f));
gs.fillRect(j*mini+begin,i*mini+begin,mini,mini );
- setColor用於設定畫筆顏色。
- setComposite用於設定透明度
- fillRect是繪製動作,引數值為起始座標和結束座標。
3. “二維碼的本質是_______”
二維碼的本質是二進位制表示資料
二維碼的黑白格,其實就代表了0和1兩位資料,我們只需要將資料轉化為bytes陣列,然後根據陣列的0-1值直接繪製到圖片上,即可生成相應的二維碼。
byte []contentByte = "需要表示的資料".getBytes("utf-8");
boolean [][]cidesOut = qrcode.calQrcode(contentByte) ;
這樣就可以生成一個cidesOut陣列來表示二維碼的黑白格。
qrcode是二維碼的生成配置,容錯率和Qrcode版本等。
Qrcode qrcode = new Qrcode();
qrcode.setQrcodeErrorCorrect(`M`);
qrcode.setQrcodeEncodeMode(`B`);
qrcode.setQrcodeVersion(3);
4. “黑白格襯衫!!!”
二維碼的本質是
黑白格襯衫!!!
雙層for迴圈遍歷cidesOut這個boolean陣列,如果是true就繪製黑色。
for(int i=0;i<cidesOut.length;i++){
for(int j=0;j<cidesOut.length;j++){
if(cidesOut[j][i]){
gs.fillRect(j*mini+begin,i*mini+begin,mini,mini );
}
}
}
GIF動畫幀繪製
1. “如何繪製一個GIF”
AnimatedGifEncoder e = new AnimatedGifEncoder();
e.setRepeat(0);
e.start(newPic);
BufferedImage src[] = new BufferedImage[pic.length];
for (int i = 0; i < src.length; i++) {
e.setDelay(playTime);
src[i] = ImageIO.read(new File(pic[i]));
e.addFrame(src[i]); //新增到幀中
}
e.finish();
首先定義一個GIF生成類.
AnimatedGifEncoder e = new AnimatedGifEncoder();
e.start(newPic);
newPic代表最後生成的gif檔名.
e.setDelay(playTime);
設定播放的延遲時間playTime.
e.setDelay(playTime);
src[i] = ImageIO.read(new File(pic[i]));
e.addFrame(src[i]);
最後將BufferedImage圖片新增到幀中.
e.finish();
GIF |
---|
2. “如何分解一個GIF”
- 載入gif
GifDecoder gd = new GifDecoder();//要處理的圖片
int status = gd.read(new FileInputStream(new File("marry.gif")));
if (status != GifDecoder.STATUS_OK) {
return;
}
- GIF幀數為gd.getFrameCount();
我們可以直接獲取每一幀的圖片並且儲存到本地。
for (int i = 0; i < gd.getFrameCount(); i++) {
//取得gif的每一幀
BufferedImage frame = gd.getFrame(i);
// 儲存frame到本地
}
可以將一個GIF分解成幀之後,我們就可以將這一幀新增二維碼,然後加入到一個新的GIF中了。
for (int i = 0; i < gd.getFrameCount(); i++) {
//取得gif的每一幀
BufferedImage frame = gd.getFrame(i);
Graphics2D gs = frame.createGraphics() ;
gs.drawImage(frame,0,0,frame.getWidth(),frame.getHeight(),null);
int qrLength = frame.getHeight()-2*frame.getHeight()/10 ;
int mini = qrLength/cidesOut.length ;
int begin = (frame.getWidth() - mini*cidesOut.length)/2 ;
for(int k=0;k<cidesOut.length;k++){
for(int j=0;j<cidesOut.length;j++){
if(cidesOut[j][k]){
gs.setColor(Color.BLACK);
gs.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP,1.0f));
gs.fillRect(j*mini+begin,k*mini+begin/4,mini,mini );
}
}
}
int delay = gd.getDelay(i);
ge.setDelay(delay);
ge.addFrame(frame);
原圖 | GIF | |
---|---|---|
原圖 | GIF | |
---|---|---|
原圖 | GIF | |
---|---|---|
相關文章
- 設定二維碼圖片背景透明教程
- 動態二維碼免費製作
- 移動端如何實現長按儲存圖片(圖片上的二維碼是動態的)?
- Python生成動態二維碼,MyQR介紹Python
- iOS 圖示&啟動圖生成器(二)iOS
- APISpace 的二維碼生成器,效果好、使用易API
- keycloak~為微信二維碼新增動態kc認可的動態state
- 易易二維碼,多功能線上檔案預覽與二維碼生成器
- phpqrcode生成動態二維碼簡單例項PHP單例
- 生成帶二維碼圖片並通過微信分享
- JavaScript動態設定元素背景圖片JavaScript
- .NET生成小程式碼,併合自定義背景圖生成推廣小程式二維碼
- three.js 製作屬於自己的動態二維碼JS
- Amazing QR!一款 Python 二維碼生成器!Python
- 禮物的最大價值(一維動態規劃&二維動態規劃)動態規劃
- 公眾號渠道二維碼 / 帶引數二維碼的典型應用場景
- php生成二維碼圖片PHP
- url 生成二維碼圖片
- 動態圖和靜態圖的程式碼區別
- 二維碼生成器,連線物理與數字世界的橋樑
- 開發者必讀!常用的二維碼生成器 API 推薦API
- 前端如何優雅的製作帶LOGO的二維碼前端Go
- 設計模式系列(圖文解析,附帶原始碼) - 生成器設計模式原始碼
- 基於ZXingAndroid實現生成二維碼圖片和相機掃描二維碼圖片即時解碼的功能Android
- 微信公眾號引數二維碼生成器使用?
- 基於ZXing Android實現生成二維碼圖片和相機掃描二維碼圖片即時解碼的功能Android
- 生成商品海報,附帶小程式二維碼
- Android的標題欄,狀態列圖示文字顏色及背景動態變化Android
- 小白也能看懂的二維碼生成器 API 的技術原理(附Java 接入程式碼)APIJava
- 二維碼管理平臺 生成二維碼
- 多檔案二維碼生成器線上報名功能,wps線上生成二維碼線上預覽線上分享
- 直播帶貨原始碼,背景圖片顯示鋪滿但不變形原始碼
- 二維陣列動態開闢與傳參陣列
- vue實現帶logo的二維碼/商品條形碼/列印商品吊牌VueGo
- canvas實現二維碼和圖片合成Canvas
- 深挖JDK動態代理(二):JDK動態生成後的位元組碼分析JDK
- 二維碼
- 直播商城原始碼,響應式的全螢幕背景圖(主介面背景圖)原始碼