文档章节

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

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

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

飓风2000
2016/12/08
15
0
Tiles2框架乱码问题jsp乱码

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

shyar
2013/02/27
530
1
Thinkphp中文水印和图片水印合体集成插件

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

2当家的
2016/12/14
183
0
javaweb前台对参数加密,后台解密,避免出现中文乱码

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

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

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

木子昭
07/13
0
0

没有更多内容

加载失败,请刷新页面

加载更多

聊聊clean code

clean code,顾名思义就是整洁的代码,或者说清晰、漂亮的代码,相信大多数工程师都希望自己能写出这样的代码。 也许这是个千人千面的话题,每个工程师都有自己的理解。比如我,从一个天天被...

Skqing
25分钟前
3
0
redis连接报错—— (error) NOAUTH Authentication required.

1.redis报认证错误 redis客户端连接成功,但是操作报异常——(error) NOAUTH Authentication required 错误的含义是说你没有认证,说明没有使用密码连接 redis-cli -h 127.0.0.1 -p 6379 -a ...

啊哈关关
31分钟前
2
0
地理位置坐标标准以及转换

/** * 地理位置坐标标准以及转换 * * 1.WGS-84原始坐标系,一般用国际GPS纪录仪记录下来的经纬度,通过GPS定位拿到的原始经纬度,Google和高德地图定位的的经纬度(国外)都是基于W...

葉者
34分钟前
1
0
Generator-ES6

基本概念 Generator 函数是 ES6 提供的一种异步编程解决方案,语法行为与传统函数完全不同。 Generator 函数有多种理解角度。语法上,首先可以把它理解成,Generator 函数是一个状态机,封装...

简心
52分钟前
6
0
FullCalendar日历插件说明文档

普通显示设置 属性 描述 默认值 header 设置日历头部信息。 如果设置为false,则不显示头部信息。包括left,center,right左中右三个位置,每个位置都可以对应以下不同的配置: title: 显示当...

ada_young
53分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部