文档章节

为图片写水印的时候中文乱码

qimh
 qimh
发布于 07/17 15:20
字数 640
阅读 29
收藏 0

缘由:源代码在本地win7 操作系统添加水印正常,但在linux 7.4 上 添加水印乱码(空心方格)

问题的本质是在linux 操作系统中没有对Font 类支持的字体,才会出现乱码

问题截图:

1.系统linux7.4

2.语言java

通过此命令可以查看系统支持的字符集

GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
String[] fontFamilies = ge.getAvailableFontFamilyNames();
for (String s : fontFamilies) {
 	System.out.println(s);
}

查看的结果

从结果来看,对中文的支持“標楷體”。

 

3.win7 正常代码

package com.housekeeper.myutils;

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.GraphicsEnvironment;
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileOutputStream;

import javax.imageio.ImageIO;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;


public class WaterMarkUtils
{
    
    /**
     * 给图片添加水印
     * 
     * @param filePath 需要添加水印的图片的路径
     * @param markContent 水印的文字
     * @param markContentColor 水印文字的颜色
     * @param qualNum 图片质量
     * @return
     */
    public void mark(String srcImgPath, String outImgPath, String watermarkStr)
    {
        try
        {
            // 读取原图片信息
            File srcImgFile = new File(srcImgPath);
            Image srcImg = ImageIO.read(srcImgFile);
            int srcImgWidth = srcImg.getWidth(null);
            int srcImgHeight = srcImg.getHeight(null);
            // 加水印
            BufferedImage bufImg = new BufferedImage(srcImgWidth, srcImgHeight, BufferedImage.TYPE_INT_RGB);
            Graphics2D g = bufImg.createGraphics();
            
            g.drawImage(srcImg, 0, 0, srcImgWidth, srcImgHeight, null);
            
            Font font = new Font("標楷體", Font.PLAIN, 50);//宋体
            g.setColor(Color.gray); // 根据图片的背景设置水印颜色
            
            g.setFont(font);
            int x = (srcImgWidth - getWatermarkLength(watermarkStr, g)) / 2;
            int y = srcImgHeight / 2;
            g.drawString(watermarkStr, x, y);
            
            g.dispose();
            // 输出图片
            FileOutputStream outImgStream = new FileOutputStream(outImgPath);
            ImageIO.write(bufImg, "jpg", outImgStream);
            outImgStream.flush();
            outImgStream.close();
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
    }
    
    // 获取水印文字总长度
    public int getWatermarkLength(String str, Graphics2D g)
    {
        return g.getFontMetrics(g.getFont()).charsWidth(str.toCharArray(), 0, str.length());
    }
    
    
    /**
	 * 向页面输出流程图片
	 * 
	 * @param request
	 * @param response
	 * @return
	 */
	public static String printWaterMark(HttpServletRequest request,
			HttpServletResponse response) {
		
		//new WaterMarkUtils().mark("/data/11.jpg", "/data/watermark.jpg", "水印就是这样的!!!!");
		new WaterMarkUtils().mark("/data/11.jpg", "/data/watermark.jpg", "水印就是这样的!!!!");
		
		
		
		GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
  		String[] fontFamilies = ge.getAvailableFontFamilyNames();
  		for (String s : fontFamilies) {
  		    System.out.println(s);
  		}
		
		
		
		return "success";

	}
    
    
    
    public static void main(String[] args)
    { // 原图位置, 输出图片位置, 水印文字
        new WaterMarkUtils().mark("D://11.jpg", "D://watermark.jpg", "水印就是这样的!!!!");
        System.out.println("end..............");
        
//        GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
//		String[] fontFamilies = ge.getAvailableFontFamilyNames();
//		for (String s : fontFamilies) {
//		    System.out.println(s);
//		}
    }
    
}

 

 

4.解决方法,在jdk 安装目录(我的jdk安装目录:/usr/local/java/jdk1.8.0_162/jre/lib/fonts/fallback)下的fonts 目录下添加fallback 目录,把C:\Windows\Fonts 目录下的字体 拷贝到fallback目录下即可(亲测可用)。或者 就使用系统原有的字体也可以。

 

参考链接:

https://blog.csdn.net/qq994406030/article/details/63262902

http://onlyor.iteye.com/blog/2102948

http://www.iteye.com/topic/1120869

© 著作权归作者所有

共有 人打赏支持
qimh
粉丝 9
博文 387
码字总数 69331
作品 0
滁州
程序员
私信 提问
Thinkphp中文水印和图片水印合体集成插件

今天给大家分享一下中文水印和图片水印合体集成插件,Thinkphp只有单独的加文字或加图片,由于工作的需要需要同里加“文字”和“图片”于是,试着修改了一下,只需要一行代码解决图片和文字水...

2当家的
2016/12/14
183
0
Linux环境下BufferedImage Graphics drawString 中文乱码解决方法

在linux环境下的,生成的带文字的图片在前台一直显示为方框乱码,windows环境正常。 img.setFont(new Font("宋体", Font.BOLD, 20)); 写中文进入图片之前必须设置字体,而且这个字体必须支持...

飓风2000
2016/12/08
15
0
javaweb前台对参数加密,后台解密,避免出现中文乱码

废话不多说,在web开放中遇到前台向后台传值,注意:中文值的时候,后台如果单纯的用request.getParamter(name);接收,得到的是一个乱码,如何避免出现中文乱码?这里简单的介绍下,我自己的...

什么是程序员
2015/12/17
68
0
Tiles2框架乱码问题jsp乱码

我直接打开某一个jsp的时候,页面里面的中文没有乱码,包括从数据库读取的数据也没有乱码,但是放在tiles2里面的时候页面的中文全部乱码,包括写死在页面的中文,求解答,是突然一下子变成的...

shyar
2013/02/27
541
1
Python(二)借助七牛云通过脚本自动获取上传图片外链

概述 之前自己写博客的时候,每次的都需要通过将本地图片上传到七牛云,然后获取图片外链,再粘贴到MarkDown编辑器里面,如果一篇博客里面图片比较少的时候,还可以忍受,图片多了就感觉特别...

wustor
2017/11/13
0
0

没有更多内容

加载失败,请刷新页面

加载更多

EOS docker开发环境

使用eos docker镜像是部署本地EOS开发环境的最轻松愉快的方法。使用官方提供的eos docker镜像,你可以快速建立一个eos开发环境,可以迅速启动开发节点和钱包服务器、创建账户、编写智能合约....

汇智网教程
今天
10
0
《唐史原来超有趣》的读后感优秀范文3700字

《唐史原来超有趣》的读后感优秀范文3700字: 作者:花若离。我今天分享的内容《唐史原来超有趣》这本书的读后感,我将这本书看了一遍之后就束之高阁了,不过里面的内容一直在在脑海中回放,...

原创小博客
今天
16
0
IC-CAD Methodology知识图谱

CAD (Computer Aided Design),计算机辅助设计,指利用计算机及其图形设备帮助设计人员进行设计工作,这个定义同样可以用来近似描述IC公司CAD工程师这个岗位的工作。 早期IC公司的CAD岗位最初...

李艳青1987
今天
15
0
CompletableFuture get方法一直阻塞或抛出TimeoutException

问题描述 最近刚刚上线的服务突然抛出大量的TimeoutException,查询后发现是使用了CompletableFuture,并且在执行future.get(5, TimeUnit.SECONDS);时抛出了TimeoutException异常,导致接口响...

xiaolyuh
今天
8
0
dubbo 搭建与使用

官网:http://dubbo.apache.org/en-us/ 一,安装监控中心(可以不安装) admin管理控制台,monitor监控中心 下载 bubbo ops 这个是新版的,需要node.js环境,我没有就用老版的了...

小兵胖胖
今天
16
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部