发布时间:2025-06-05
浏览次数:0
嗨,大家好,不管是早上、晚上还是凌晨,相信阅读这篇文章的朋友们中既有新面孔,也有熟悉的老朋友。在此,我先做个简短的自我介绍:我是灰灰,在程序员行列中算是资深的内容整理者;今天,因为没有与我搭档的搭档老师,所以我只能给大家带来一篇单人的分享博文了。
街头巷尾充斥着“520促销,买一赠一”的标语,宣告了初夏首个特别节日的到来。然而,恰逢5月21日这一天,我竟然才意识到,竟然又迎来了520。再细看手机,我的天intellij idea golang plugin,居然已经过去了。这下回家,恐怕得向我那花费200元巨款购买的机械键盘道歉了。
迅速激活那拥有高达249智商的头脑,深思熟虑一番,探寻可行的挽救之策。是时候解锁那久未启用的陈旧人肉搜索技能了,浏览朋友圈中晒出的图片,或许能从中获得一些有价值的灵感闪现。
有心人的努力终究未能得偿所愿,结果空手而归;若是脚踏实地运用自己的编程技能,这些码农又能创造出哪些充满浪漫的成果呢?
选择颇多,然而接下来仅需解决一个疑问,即在5月21日赠送5月20日的礼物,这样的行为是否能够得到宽恕?(亲爱的美少女们,不妨扪心自问,然后在评论区高声回应‘可以’如何?)
即便再多的小仙女对我说可以,理智上我仍旧不敢轻信。现在,我将免费向各位读者展示一个价值99元的创意点子——以她的名字为主题创作一幅画作(见附图),然后真挚地向她说明,这幅画全是手工绘制,考虑到如此庞大的工作量,延迟一两天是很正常的吧?(大声告诉我,这样的做法是不是很聪明呢?)
接下来,经验丰富的驾驶员将亲自指导你,教你如何仅用三十行文字,通过她(他它)的名字来绘制一幅她的艺术画作。
洋洋洒洒的文字竟然还未触及正题,我自个儿都觉得文章内容过于冗余,现在让我们回到正题,探讨一下如何利用她的名字来创作画作吧。
1. 作战思路
目标既定,接下来的任务便是制定方案。众所周知,计算机的世界是由0和1构建而成,那么,在这片领域,图片又是以何种元素为基石的呢?
我已捕捉到那些聪明伶俐伙伴心中所想,没错,正是那些色彩斑斓的像素单元。
那么,我们究竟该做什么呢?答案已然跃然纸上,各位侠士与仙子们,不妨齐声高呼,让我听听你们的答案如何?
嗯,言归正传,只需逐个替换这些像素单元,用相应的名字来替代即可。
2. 战前准备
俗话说兵马未动,粮草先行,正式开干之前,先做一些必要的准备
如有侵权,联系即删,只要不赔钱,要啥都行
既然情况如此,我们便依照自愿的原则,最终确定选用——爪蛙(JAVA)。
3. 开战
感谢各位伙伴们选择了Java,这可是我的拿手好戏。接下来,我们就来探讨如何达成我们的目标。就像将大象塞进冰箱只需三步那样,我们所需遵循的步骤同样简洁明了。
步骤拆解:
实现源码:
变量a被赋值为通过将color与0xff000000进行按位与操作后,结果右移24位得到的数值。
获取颜色值中红色部分的数值,首先将颜色值与0x00ff0000进行按位与操作,然后结果右移16位。
变量g的值等于将color与0x0000ff00进行按位与操作后,再将结果右移8位。
int b = (0x000000ff & color);
return new Color(r, g, b, a);
}
public void 生成字符图像(字符串 imgPath,字符串 name,字符串 saveFile)可能会抛出异常
// 第一步,载图片
通过ImageIO类读取指定路径的文件,将其转换为BufferedImage对象,赋值给img变量。
获取图片宽度为w,高度为h。
// 第二步,创建等大的画板
创建一个新的BufferedImage对象,其宽度为w,高度为h,图像类型与原图像相同。
output对象调用了createGraphics方法,成功生成了一个名为g2d的Graphics2D实例。
字号设定为1。
int index = 0;
for (int x = 0; x < w; x++) {
for (int y = 0; y < h; y++) {
// 第三步,遍历每个像素点,并获取对应的rgb
char ch = name.charAt((index++) % name.length());
g2d.setColor(int2color(img.getRGB(x, y)));
// 第四步,写上他她它的名字
g2d.drawString(String.valueOf(ch), x, y);
}
}
// 第五步,保存图片
g2d.dispose();
ImageIO.write(output, "png", new File(saveFile));
}
复制代码
就这么简单,赶紧跑一下试试效果
似乎有些不对劲,它与原图几乎一模一样,那么问题究竟在哪里呢?在像素点上显示的文字,我的钛合金眼镜根本无法辨认,这该怎么办才好呢?
说得对,只需将图片进行放大处理,问题便能迎刃而解。因此,我们可以将画板进行适当调整,将其放大至24倍,并将字体大小设定为20,同时确保字与字之间保持一定的间距。
public void renderCharPhoto(String imgPath, String name, String saveFile) throws Exception {
BufferedImage img = ImageIO.read(new File(imgPath));
int w = img.getWidth(), h = img.getHeight();
创建一个新的BufferedImage对象,其宽度为原图宽度的24倍,高度为原图高度的24倍,且图像类型与原图相同。
Graphics2D g2d = output.createGraphics();
g2d设置字体为“宋体”,并指定字体样式为普通,字号为20。
int index = 0;
for (int x = 0; x < w; x++) {
for (int y = 0; y < h; y++) {
char ch = name.charAt((index++) % name.length());
g2d.setColor(int2color(img.getRGB(x, y)));
g2d.drawString(String.valueOf(ch), x * 24 + 2, y * 24 + 2);
}
}
g2d.dispose();
ImageIO.write(output, "png", new File(saveFile));
}
复制代码
观察右侧图像,放大后依然清晰可见:blog.hhui.top//img…
这份规范的宋体字体似乎透露着某种信息,若向他(她或它)透露这实际上是由手绘而成,他会(她或它)相信吗?
为了更逼真一点,换个手绘字体试一试,网上搜索一下,从这里
www..com//446 下载了一个 潇洒手写体资源
然后再调整一下上面代码中的字体设置
public void renderCharPhoto(String imgPath, String name, String saveFile) throws Exception {
BufferedImage img = ImageIO.read(new File(imgPath));
int w = img.getWidth(), h = img.getHeight();
BufferedImage output = new BufferedImage(w * 24, h * 24, img.getType());
Graphics2D g2d = output.createGraphics();
// 使用自定义的字体
尝试执行以下操作:通过使用`Files.newInputStream`方法创建一个`InputStream`对象,该对象关联到位于"D://MobileFile/"路径下的"潇洒手写体.ttf"文件。
创建字体对象时,采用TrueType字体格式,从输入流中读取数据以生成字体实例。
字体大小调整为20。
}
int index = 0;
for (int x = 0; x < w; x++) {
for (int y = 0; y < h; y++) {
char ch = name.charAt((index++) % name.length());
g2d.setColor(int2color(img.getRGB(x, y)));
g2d.drawString(String.valueOf(ch), x * 24 + 2, y * 24 + 2);
}
}
g2d.dispose();
ImageIO.write(output, "png", new File(saveFile));
}
复制代码
原图看右边,放大不失真: blog.hhui.top//img…
如果对方很熟悉你的字体怎么办?
解决之道是存在的,只需在应用商店中搜索“造字”二字,同时,你还可以借此机会为自己定制一款独树一帜的个性化字体。
太棒了,这样一来似乎完美无缺了;只需将那张图片拿到打印店进行彩绘处理,任务就完成了;带走吧,不必客气。
不幸的是,若你遇到了一位聪明伶俐的对话者,那么她/他/它很可能会向你抛出一个问题,询问你是如何做到文字与间距如此精准无误的?
经过一番絮叨,我突然心生疑问,这个520特殊的日子,对于我这个单身人士来说,究竟有何关联呢?
4. 战后福利
在这三十行代码中,我亲自指导你如何哄(糊弄)你的女票,其基本功能相当全面。当然,作为一个如此贴心的我,也为大家带来了更加便捷的操作方式intellij idea golang plugin,比如可以直接从网络中导入图片和字体。
public 方法 testCharPicture() 在抛出异常 Exception 的情况下执行
prefix = "/tmp/";
String img = "请访问以下链接获取图片:http://hbimg.b0.upaiyun.com/2b79e7e15883d8f8bbae0b1d1efd6cf2c0c1ed1b10753-cusHEA_fw236"。
ImgPixelWrapper.build()
.setSourceImg(img)
.setChars("小黄人")
字体资源下载链接:https://www.diyiziti.com/Builder/446,请点击此地址获取所需字体文件。
设置字体名称为“https://font.js.live/front/font/download?id=446”。
.setBlockSize(24)
.setFontSize(22)
.setBgPredicate(color -> {
// 指定背景色,不渲染文本
if (color == 0) return true;
通过ColorUtil类中的int2color方法,成功将color整数值转换为了Color对象,得到的结果赋值给了变量rc。
// 将白色当作背景色
若rc对象的红色值不小于245,绿色值也不小于245,蓝色值同样不小于245,则返回true;否则返回false。
})
设置像素类型为字符序列放大模式。
构建后将其转换为文件,文件名为前缀加“/char_pic_xhr.jpg”。
输出显示:“---- 结束 ---”。
}
复制代码
对应的源码: .com//qu…
引入方式也很简单
image-plugin
com.github.liuyueyi.media
2.6.4
复制代码
确实十分贴心,的确令人感动,或许您会想要点赞、留下评论表达支持,甚至还可以收藏起来,以备不时之需。
如有侵权请联系删除!
Copyright © 2023 江苏优软数字科技有限公司 All Rights Reserved.正版sublime text、Codejock、IntelliJ IDEA、sketch、Mestrenova、DNAstar服务提供商
13262879759
微信二维码