Я участвую в творческом конкурсе «Праздник середины осени».Творческий конкурс «Праздник середины осени»
Приближается фестиваль середины осени еще одного года, как мы можем поднять волну его популярности? Как кодер, возможно ли написать стихотворение с кодом? Идея хорошая, но, к сожалению, немного сложная, поэтому давайте упростим ее и добавим лунные лепешки в ваш QR-код.
1. Добавить лунные пряники на логотип?
Добавить лунные пирожные в QR-код не кажется сложным, просто найдите генератор QR-кодов в Интернете, затем найдите изображение лунного пирога и используйте его в качестве логотипа, игра окончена.
(Чтобы избежать сбоя обзора, обычно удаляют глазок кода QR-кода, и это нормально, что его нельзя распознать)
Если этим ограничиться, то эта статья будет бессмысленной, и тогда мы будем смотреть на что-то другое
2. Отклонить черно-белые блоки, полноэкранный QR-код
Далее используем гитхабquick-media:qrcode-plugin
Для более интересной настройки QR-кода
Сначала введите зависимости
<dependency>
<groupId>com.github.liuyueyi.media</groupId>
<artifactId>qrcode-plugin</artifactId>
<version>2.6.1</version>
</dependency>
Затем мы используем трехмесячную круговую диаграмму для создания QR-кода, полного лунных пирогов.
Также очень просто сгенерировать приведенный выше QR-код, код реализации выглядит следующим образом.
String sourcePrefix = "/Users/user/Documents/qr/";
QrCodeGenWrapper.of(msg)
.setW(500)
.setH(500)
.setErrorCorrection(ErrorCorrectionLevel.M)
.setDiaphaneityFill(true) // 透明处用背景色填充
.setDrawBgColor(Color.WHITE)
.setDrawStyle(QrCodeOptions.DrawStyle.IMAGE_V2)
.setImgResourcesForV2(RenderImgResourcesV2.create()
// 下面配置 1 x 1的方块对应的月饼图片
.addSource(1, 1).addImg(sourcePrefix + "00.png")
.addImg(sourcePrefix + "01.png")
.addImg(sourcePrefix + "02.png", 1) // 最后一个1,表示这个月饼只出现一次
.addImg(sourcePrefix + "03.png")
.build()
// 下面配置 2 x 2的方块对应的月饼图片
.addSource(2, 2)
.addImg(sourcePrefix + "00.png").addImg(sourcePrefix + "01.png")
.addImg(sourcePrefix + "02.png", 1)
.addImg(sourcePrefix + "03.png").build()
.addSource(3, 3).addImg(sourcePrefix + "00.png").addImg(sourcePrefix + "01.png")
.addImg(sourcePrefix + "02.png", 1)
.addImg(sourcePrefix + "03.png").build()
)
.asFile(sourcePrefix + "/out0.jpg");
Хотя QR-код с полным экраном лунных пирожных генерируется выше, идентификация представляет собой проблему.Ключевым моментом являются три глаза кода (графика обнаружения)
3. Кодовый глаз тоже должен быть ярким
Поскольку приведенный выше кодовый глаз недостаточно хорош, замените его и замените сгенерированный по умолчанию кодовый глаз на собственный кодовый глаз, чтобы улучшить скорость распознавания.
Для реализации приведенного выше двумерного кода метод также очень прост: на основе предыдущего задайте шаблон обнаружения.
// 设置左上角码眼
.setLTDetectImg(sourcePrefix + "d1.jpg")
// 设置左下角码眼
.setLDDetectImg(sourcePrefix + "d2.jpg")
// 设置右上角码眼
.setRTDetectImg(sourcePrefix + "d3.jpg")
Остальные способы настройки ничем не отличаются от предыдущих, реализация следующая
String sourcePrefix = "/Users/user/Documents/qr/";
QrCodeGenWrapper.of(msg)
.setW(500)
.setH(500)
.setErrorCorrection(ErrorCorrectionLevel.M)
.setDiaphaneityFill(true) // 透明处用背景色填充
.setDrawBgColor(Color.WHITE)
.setDrawStyle(QrCodeOptions.DrawStyle.IMAGE_V2)
.setLTDetectImg(sourcePrefix + "d1.jpg")
.setLDDetectImg(sourcePrefix + "d2.jpg")
.setRTDetectImg(sourcePrefix + "d3.jpg")
.setImgResourcesForV2(RenderImgResourcesV2.create()
.addSource(1, 1).addImg(sourcePrefix + "00.png")
.addImg(sourcePrefix + "01.png")
.addImg(sourcePrefix + "02.png", 1)
.addImg(sourcePrefix + "03.png")
.build()
.addSource(2, 2)
.addImg(sourcePrefix + "00.png").addImg(sourcePrefix + "01.png")
.addImg(sourcePrefix + "02.png", 1)
.addImg(sourcePrefix + "03.png").build()
.addSource(3, 3).addImg(sourcePrefix + "00.png").addImg(sourcePrefix + "01.png")
.addImg(sourcePrefix + "02.png", 1)
.addImg(sourcePrefix + "03.png").build()
)
.asFile(sourcePrefix + "/out_d0.jpg");
4. QR-код со стихами
Поскольку в начале было сказано, что Праздник середины осени должен использовать код для написания стихов, чтобы завоевать популярность, хотя я не умею писать стихи, но как штатный ctrl+c/ctrl+v кодер, я могу его скопировать Далее мы будем использовать вечное имя Су Ши, которое будет напечатано на нашем QR-коде.
Вышеприведенный двухмерный код немного интересен. Он напрямую отображается на китайском языке. Его также очень просто реализовать. Можно использовать следующие простые конфигурации.
String sourcePrefix = "/Users/user/Documents/qr/";
QrCodeGenWrapper.of(msg)
.setDetectSpecial() // 三个码眼还是用标砖的码眼
.setDrawStyle(QrCodeOptions.DrawStyle.TXT)
.setQrText("明月几时有把酒问青天不知天上宫阙今夕是何年我欲乘风归去又恐琼楼玉宇高处不胜寒起舞弄清影何似在人间" +
"转朱阁低绮户照无眠不应有恨何事长向别时圆人有悲欢离合月有阴晴圆缺此事古难全但愿人长久千里共婵娟")
.setLogo(sourcePrefix+"/logo2.jpg") // 添加一个logo
.setLogoStyle(QrCodeOptions.LogoStyle.ROUND)
.setLogoBorderBgColor(Color.GRAY)
.asFile(sourcePrefix + "/ft.jpg");
5. Есть стихи и QR-коды для лунных пирогов
Только стихи без лунных пряников некрасивы; только лунные лепешки без стихов недостаточно хороши, затем объедините их, чтобы создать QR-код, подобный следующему
Следует отметить, что вышеуказанный пакет не предоставляет такого метода микширования, нам нужно вытащить его в исходный код, чтобы настроить его и переписать метод в QrCodeOption.DrawStyle.
IMAGE_V2 {
@Override
public void draw(Graphics2D g2d, int x, int y, int w, int h, BufferedImage img, String txt) {
String source = "明月几时有把酒问青天不知天上宫阙今夕是何年我欲乘风归去又恐琼楼玉宇高处不胜寒起舞弄清影何似在人间" +
"转朱阁低绮户照无眠不应有恨何事长向别时圆人有悲欢离合月有阴晴圆缺此事古难全但愿人长久千里共婵娟";
if ("false".equals(txt)) {
if (Math.random() < 0.8f) {
if (Math.random() < 0.6f) {
int offsetX = w / 5, offsetY = h / 5;
int width = w - offsetX * 2, height = h - offsetY * 2;
g2d.fillRect(x + offsetX, y + offsetY, width, height);
return;
}
int index = QuickQrUtil.getIndex();
if (index >= source.length()) {
int offsetX = w / 5, offsetY = h / 5;
int width = w - offsetX * 2, height = h - offsetY * 2;
g2d.fillRect(x + offsetX, y + offsetY, width, height);
} else {
Font oldFont = g2d.getFont();
if (oldFont.getSize() != w) {
Font newFont = QuickQrUtil.font(oldFont.getName(), oldFont.getStyle(), w);
g2d.setFont(newFont);
}
g2d.drawString(source.substring(index, index+1), x, y + w);
g2d.setFont(oldFont);
}
} else {
g2d.drawImage(img.getScaledInstance(w, h, Image.SCALE_SMOOTH), x, y, null);
}
} else {
g2d.drawImage(img.getScaledInstance(w, h, Image.SCALE_SMOOTH), x, y, null);
}
}
@Override
public boolean expand(DotSize dotSize) {
return true;
}
}
6. Заставьте QR-код двигаться
Все вышеперечисленное является статическим.Затем мы даем ему возможность перемещаться и генерировать gif-версию двумерного кода.Нам нужно сделать не так много вещей, просто найти фоновое изображение gif.
Метод генерации вышеуказанного динамического QR-кода также очень прост, базовая конфигурация такая же, как и предыдущая, отличие заключается в указанном фоновом gif-изображении.
String sourcePrefix = "/Users/user/Documents/qr/";
QrCodeGenWrapper.of(msg)
.setW(160)
.setH(160)
.setErrorCorrection(ErrorCorrectionLevel.M)
.setDiaphaneityFill(true) // 透明处用背景色填充
.setDrawBgColor(Color.WHITE)
.setPadding(0)
.setDrawStyle(QrCodeOptions.DrawStyle.IMAGE_V2)
.setDetectSpecial()
.setImgResourcesForV2(RenderImgResourcesV2.create()
.addSource(1, 1).addImg(sourcePrefix + "00.png")
.addImg(sourcePrefix + "01.png")
.addImg(sourcePrefix + "02.png", 1)
.addImg(sourcePrefix + "03.png")
.build()
.addSource(2, 2)
.addImg(sourcePrefix + "00.png").addImg(sourcePrefix + "01.png")
.addImg(sourcePrefix + "02.png", 1)
.addImg(sourcePrefix + "03.png").build()
.addSource(3, 3).addImg(sourcePrefix + "00.png").addImg(sourcePrefix + "01.png")
.addImg(sourcePrefix + "02.png", 1)
.addImg(sourcePrefix + "03.png").build()
)
.setLogo(sourcePrefix+"/logo.jpg")
.setLogoRate(12)
.setLogoStyle(QrCodeOptions.LogoStyle.ROUND)
.setLogoBorderBgColor(Color.GRAY)
// 下面是设置背景图,表示将二维码覆盖在背景图的指定坐标上
.setBgImg(sourcePrefix + "/bg4.gif")
.setBgStyle(QrCodeOptions.BgImgStyle.FILL)
.setBgStartX(10)
.setBgStartY(120)
.asFile(sourcePrefix + "/out3.gif");
}
В дополнение к вышеупомянутой динамике вы также можете добиться эффекта анимации, похожего на логотип, например:
Добиться поз тоже очень просто, с помощьюFtImg
Указать переднее gif-изображение можно
String sourcePrefix = "/Users/user/Documents/qr/";
QrCodeGenWrapper.of(msg)
.setW(500)
.setH(500)
.setDiaphaneityFill(true) // 透明处用背景色填充
.setDrawBgColor(ColorUtil.OFF_WHITE) // 设置背景色为米黄色,方便gif图的显示效果
.setDrawStyle(QrCodeOptions.DrawStyle.IMAGE_V2)
.setDetectSpecial()
.setImgResourcesForV2(RenderImgResourcesV2.create()
.addSource(1, 1).addImg(sourcePrefix + "00.png")
.addImg(sourcePrefix + "01.png")
.addImg(sourcePrefix + "02.png", 1)
.addImg(sourcePrefix + "03.png")
.build()
.addSource(2, 2)
.addImg(sourcePrefix + "00.png").addImg(sourcePrefix + "01.png")
.addImg(sourcePrefix + "02.png", 1)
.addImg(sourcePrefix + "03.png").build()
.addSource(3, 3).addImg(sourcePrefix + "00.png").addImg(sourcePrefix + "01.png")
.addImg(sourcePrefix + "02.png", 1)
.addImg(sourcePrefix + "03.png").build()
)
// 直接从网络下载gif图,缩放为 112 * 120, 在二维码中间绘制
.setFtImg("https://b-ssl.duitang.com/uploads/item/201609/14/20160914224309_WNUaE.gif")
.setFtW(112)
.setFtH(120)
.setFtStartX(-194)
.setFtStartY(-190)
.asFile(sourcePrefix + "/out_ft1.gif");
7. Последний из последних
Наконец, я заявляю, что все ресурсы в этой статье взяты из Интернета.Если есть какие-либо нарушения, пожалуйста, свяжитесь со мной и удалите их.Все QR-коды в этой статье сгенерированы на основе квик-медиа проекта с открытым исходным кодом.Заинтересованные партнеры можно попробовать.GitHub.com/JuneB/Go…В конце концов, фестиваль лунного пряника уже здесь, так что я все равно должен его съесть.
II. Другое
1. Серый блог:liuyueyi.github.io/hexblog
Серый личный блог, записывающий все посты блога по учебе и работе, приглашаю всех в гости
2. Заявление
Это не так хорошо, как письмо. Вышеупомянутое содержание чисто из семьи. Из-за ограниченных личных способностей неизбежно будут упущения и ошибки. Если вы обнаружите ошибки или у вас есть лучшие предложения, вы можете критиковать и поправьте их.
- Адрес вейбо:Блог Маленького Серого
- QQ: серо-серый / 3302797840
- Публичный аккаунт WeChat:серый блог