生成二維碼闽坡,帶logo

生成帶用戶圖片的二維碼,代碼如下:

package Fuck;

import java.awt.Color;

import java.awt.Graphics2D;

import java.awt.Image;

import java.awt.image.BufferedImage;

import java.io.File;

import java.io.IOException;

import java.io.OutputStream;

import javax.imageio.ImageIO;

import org.im4java.core.ConvertCmd;

import org.im4java.core.IM4JavaException;

import org.im4java.core.IMOperation;

import com.swetake.util.Qrcode;

public class TwoDimensionCode {

private static String imgType = "png";// 二維碼圖片格式

private static int size = 7;// 二維碼尺寸

private String codeType = "utf-8";

public static String IMAGEMAGICK = "/usr/local/Cellar/imagemagick/7.0.5-0/bin";

private static String person = "http://wx.qlogo.cn/mmopen/SGIdzVKlfzFA5k0GvqTjEEldrm3cuZypKQ8Z1WrPa5I83dOVwibQ65fJwbchgWouLPvexzlksN5ch0SLgUicMSdlxxaAMlGje1/0";

// 設(shè)置二維碼中間圖片的寬高

private int imageWidth = 30;

private int imageHeight = 30;

/**

*

* 生成二維碼(QRCode)圖片

*

* @param content

*? ? ? ? ? ? 存儲(chǔ)內(nèi)容

*

* @param imgPath

*? ? ? ? ? ? 圖片路徑

*

* @param imgType

*? ? ? ? ? ? 圖片類型

*

* @param size

*? ? ? ? ? ? 二維碼尺寸

*

*/

public void encoderQRCode(String content, String imgPath, String imgType, int size) {

try {

BufferedImage bufImg = this.qRCodeCommon(content, imgType, size);

// 在二維碼中間加入圖片

createPhotoAtCenter(bufImg);

File imgFile = new File(imgPath);

// 生成二維碼QRCode圖片

ImageIO.write(bufImg, imgType, imgFile);

} catch (Exception e) {

e.printStackTrace();

}

}

/**

* 生成二維碼(QRCode)圖片

*

* @param content

*? ? ? ? ? ? 存儲(chǔ)內(nèi)容

* @param output

*? ? ? ? ? ? 輸出流

* @param imgType

*? ? ? ? ? ? 圖片類型

* @param size

*? ? ? ? ? ? 二維碼尺寸

*/

public void encoderQRCode(String content, OutputStream output, String imgType, int size) {

try {

BufferedImage bufImg = this.qRCodeCommon(content, imgType, size);

// 在二維碼中間加入圖片

// createPhotoAtCenter(bufImg);

// 生成二維碼QRCode圖片

ImageIO.write(bufImg, imgType, output);

} catch (Exception e) {

e.printStackTrace();

}

}

/**

*

* 生成二維碼(QRCode)圖片的公共方法

*

* @param content

*? ? ? ? ? ? 存儲(chǔ)內(nèi)容

*

* @param imgType

*? ? ? ? ? ? 圖片類型

*

* @param size

*? ? ? ? ? ? 二維碼尺寸

*

* @return

*

*/

private BufferedImage qRCodeCommon(String content, String imgType, int size) {

BufferedImage bufImg = null;

try {

Qrcode qrcodeHandler = new Qrcode();

// 設(shè)置二維碼排錯(cuò)率,可選L(7%)散庶、M(15%)采呐、Q(25%)若锁、H(30%),排錯(cuò)率越高可存儲(chǔ)的信息越少斧吐,但對(duì)二維碼清晰度的要求越小

qrcodeHandler.setQrcodeErrorCorrect('M');

qrcodeHandler.setQrcodeEncodeMode('B');

// 設(shè)置設(shè)置二維碼尺寸又固,取值范圍1-40,值越大尺寸越大煤率,可存儲(chǔ)的信息越大

qrcodeHandler.setQrcodeVersion(size);

// 獲得內(nèi)容的字節(jié)數(shù)組仰冠,設(shè)置編碼格式

byte[] contentBytes = content.toString().getBytes(codeType);

// 圖片尺寸

int imgSize = 67 + 12 * (size - 1);

bufImg = new BufferedImage(imgSize, imgSize, BufferedImage.TYPE_INT_RGB);

Graphics2D gs = bufImg.createGraphics();

// 設(shè)置背景顏色

gs.setBackground(Color.WHITE);

gs.clearRect(0, 0, imgSize, imgSize);

// 設(shè)定圖像顏色> BLACK

gs.setColor(Color.BLACK);

// 設(shè)置偏移量,不設(shè)置可能導(dǎo)致解析出錯(cuò)

int pixoff = 2;

// 輸出內(nèi)容> 二維碼

if (contentBytes.length > 0 && contentBytes.length < 800) {

boolean[][] codeOut = qrcodeHandler.calQrcode(contentBytes);

for (int i = 0; i < codeOut.length; i++) {

for (int j = 0; j < codeOut.length; j++) {

if (codeOut[j][i]) {

gs.fillRect(j * 3 + pixoff, i * 3 + pixoff, 3, 3);

}

}

}

} else {

throw new Exception("QRCode content bytes length = " + contentBytes.length + " not in [0, 800].");

}

gs.dispose();

bufImg.flush();

} catch (Exception e) {

e.printStackTrace();

}

return bufImg;

}

/**

* 在二維碼中間加入圖片

*

* @param bugImg

* @return

*/

private BufferedImage createPhotoAtCenter(BufferedImage bufImg) throws Exception {

Image im = ImageIO.read(new File("/Users/song/Desktop/2.png"));

Graphics2D g = bufImg.createGraphics();

// 獲取bufImg的中間位置

int centerX = bufImg.getMinX() + bufImg.getWidth() / 2 - imageWidth / 2;

int centerY = bufImg.getMinY() + bufImg.getHeight() / 2 - imageHeight / 2;

g.drawImage(im, centerX, centerY, imageWidth, imageHeight, null);

g.dispose();

bufImg.flush();

return bufImg;

}

public static void main(String[] args) throws IOException {

// String imgPath = "/Users/song/Desktop/8.jpeg";

// String encoderContent = "13663865897";

// TwoDimensionCode handler = new TwoDimensionCode();

// handler.encoderQRCode(encoderContent, imgPath, imgType, size);

System.out.println("解析結(jié)果如下:");

try {

maskCompositePic("/Users/song/Desktop/80.jpg");

} catch (InterruptedException e) {

// TODO Auto-generated catch block

e.printStackTrace();

} catch (IM4JavaException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

public static void maskCompositePic(String desPath)

throws IOException, InterruptedException, IM4JavaException {

// 獲取圖片的寬高h(yuǎn)ttp://image.haiziyouke.com/010101.jpg? width750:height900

// BufferedImage bi = ImageIO.read(new File("/Users/song/Desktop/2.jpg"));

// int width = bi.getWidth();

// int height = bi.getHeight();

// System.out.println("width" + width + ":height" + height);

IMOperation op = new IMOperation();

op.addImage("/Users/song/Desktop/8.jpg");

op.compose("atop");

op.addImage("/Users/song/Desktop/8.jpeg");

//op.addImage(TO);width + 60, height + 60

//op.geometry(width + 60, height + 60, 482,630);

op.geometry(110,110, 479,575);

op.composite();

op.addImage(desPath);

ConvertCmd cmd = new ConvertCmd();

cmd.setSearchPath(IMAGEMAGICK);

cmd.run(op);

}

}

實(shí)體類:

package Fuck;

import java.awt.image.BufferedImage;

import jp.sourceforge.qrcode.data.QRCodeImage;

public class TwoDimensionCodeImage implements QRCodeImage{

BufferedImage bufImg;

public TwoDimensionCodeImage(BufferedImage bufImg) {

this.bufImg = bufImg;

}

public int getHeight() {

return bufImg.getHeight();

}

public int getPixel(int x, int y) {

return bufImg.getRGB(x, y);

}

public int getWidth() {

return bufImg.getWidth();

}

}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末蝶糯,一起剝皮案震驚了整個(gè)濱河市洋只,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌昼捍,老刑警劉巖识虚,帶你破解...
    沈念sama閱讀 221,198評(píng)論 6 514
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異妒茬,居然都是意外死亡担锤,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,334評(píng)論 3 398
  • 文/潘曉璐 我一進(jìn)店門(mén)乍钻,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)肛循,“玉大人铭腕,你說(shuō)我怎么就攤上這事《嗫罚” “怎么了累舷?”我有些...
    開(kāi)封第一講書(shū)人閱讀 167,643評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)熬丧。 經(jīng)常有香客問(wèn)我笋粟,道長(zhǎng),這世上最難降的妖魔是什么析蝴? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,495評(píng)論 1 296
  • 正文 為了忘掉前任害捕,我火速辦了婚禮,結(jié)果婚禮上闷畸,老公的妹妹穿的比我還像新娘尝盼。我一直安慰自己,他們只是感情好佑菩,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,502評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布盾沫。 她就那樣靜靜地躺著,像睡著了一般殿漠。 火紅的嫁衣襯著肌膚如雪赴精。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 52,156評(píng)論 1 308
  • 那天绞幌,我揣著相機(jī)與錄音蕾哟,去河邊找鬼。 笑死莲蜘,一個(gè)胖子當(dāng)著我的面吹牛谭确,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播票渠,決...
    沈念sama閱讀 40,743評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼逐哈,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了问顷?” 一聲冷哼從身側(cè)響起昂秃,我...
    開(kāi)封第一講書(shū)人閱讀 39,659評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎杜窄,沒(méi)想到半個(gè)月后肠骆,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,200評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡羞芍,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,282評(píng)論 3 340
  • 正文 我和宋清朗相戀三年哗戈,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了郊艘。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片荷科。...
    茶點(diǎn)故事閱讀 40,424評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡唯咬,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出畏浆,到底是詐尸還是另有隱情胆胰,我是刑警寧澤,帶...
    沈念sama閱讀 36,107評(píng)論 5 349
  • 正文 年R本政府宣布刻获,位于F島的核電站蜀涨,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏蝎毡。R本人自食惡果不足惜厚柳,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,789評(píng)論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望沐兵。 院中可真熱鬧别垮,春花似錦、人聲如沸扎谎。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,264評(píng)論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)毁靶。三九已至胧奔,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間预吆,已是汗流浹背龙填。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,390評(píng)論 1 271
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留啡浊,地道東北人觅够。 一個(gè)月前我還...
    沈念sama閱讀 48,798評(píng)論 3 376
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像巷嚣,于是被迫代替她去往敵國(guó)和親喘先。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,435評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理廷粒,服務(wù)發(fā)現(xiàn)窘拯,斷路器,智...
    卡卡羅2017閱讀 134,693評(píng)論 18 139
  • ¥開(kāi)啟¥ 【iAPP實(shí)現(xiàn)進(jìn)入界面執(zhí)行逐一顯】 〖2017-08-25 15:22:14〗 《//首先開(kāi)一個(gè)線程坝茎,因...
    小菜c閱讀 6,440評(píng)論 0 17
  • 通過(guò) 生成二維碼之 Java (Google zxing) 篇 我們可以實(shí)現(xiàn)簡(jiǎn)單二維碼的生成, 但是二維碼顯示卻過(guò)...
    jnil閱讀 3,383評(píng)論 1 5
  • 參考資料JAVA 生成二維碼筆記, 谷歌 Zxing 二維碼涤姊,用數(shù)據(jù)流輸出到頁(yè)面顯示 項(xiàng)目環(huán)境jdk1.8(**z...
    jnil閱讀 13,169評(píng)論 1 5
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語(yǔ)法,類相關(guān)的語(yǔ)法嗤放,內(nèi)部類的語(yǔ)法思喊,繼承相關(guān)的語(yǔ)法,異常的語(yǔ)法次酌,線程的語(yǔ)...
    子非魚(yú)_t_閱讀 31,657評(píng)論 18 399