200分,请高手帮忙!linux上的图片处理问题。

zhwquan 2004-04-28 02:22:59
我是用servlet画了个图片,汉字显示成方框,怎么办?
package untitled2;

import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
import java.util.*;
import com.sun.image.codec.jpeg.JPEGImageEncoder;
import com.sun.image.codec.jpeg.JPEGCodec;
import java.awt.image.BufferedImage;
import java.awt.*;
/**
* <p>Title: </p>
* <p>Description: </p>
* <p>Copyright: Copyright (c) 2004</p>
* <p>Company: </p>
* @author not attributable
* @version 1.0
*/

public class Servlet1 extends HttpServlet {
private static final String CONTENT_TYPE = "image/jpeg; charset=GBK";

//Initialize global variables
public void init() throws ServletException {
}

//Process the HTTP Get request
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType(CONTENT_TYPE);
try
{
int newwidth=100;
int newheight=100;
BufferedImage image;
//绘制缩略图
BufferedImage buffImg = new BufferedImage(newwidth,newheight,BufferedImage.TYPE_INT_RGB);
Graphics g = buffImg.createGraphics();
g.setColor(Color.white);
g.fillRect(0,0,newwidth,newheight);
g.setColor(Color.black);
g.drawString("张维全",50,10);
g.drawString(new String("张维全".getBytes(),"GBK"),50,20);
g.drawString(new String("张维全".getBytes("ISO8859_1"),"GBK"),50,30);
g.drawString(new String("张维全".getBytes("ISO8859_1"),"GB2312"),50,40);
g.drawString(new String("张维全".getBytes(),"GB2312"),50,50);
g.drawString(new String("张维全".getBytes(),"ISO8859_1"),50,60);
g.dispose();
//输出缩略图
java.io.OutputStream tempout=null;
tempout=response.getOutputStream();
JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(tempout);
encoder.encode(buffImg);
//

if(tempout!=null)
tempout.close();

}
catch(Exception e){
System.out.println("picTest:"+e.getMessage());
}
}

//Clean up resources
public void destroy() {
}
}
...全文
28 点赞 收藏 5
写回复
5 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
zhwquan 2004-05-10
to : blue999star,搞定了,谢谢哦

具体办法如下:
中文TrueType字体是容易获得的,如在Windows操作系统中缺省提供的几种,或市面上的方正,文鼎等。购买后拷贝至Unix平台上即可。

2。让Java引用指明的中文字体

在JRE 的fonts.propertie中指明了Java 运行时字体的来源,在Windows 环境下,字体名形如:Courier New,ANSI_CHARSET,而在Unix下,字体名则为:adobe-times-medium-r-normal--*-%d-*-*-*-*-iso8859-1。所以,即便是同样的字体,在font.properties中的写法也是不一样的。Unix下,关于一个TrueType字体文件中包含了几种字体类型, 是通过字体所在目录中fonts.dir文件指明的。以下是fonts.dir示例:
4
SIMSUN.TTF -misc-SimSun-medium-r-normal--0-0-0-0-p-0-ascii-0
SIMSUN.TTF -misc-SimSun-medium-r-normal--0-0-0-0-p-0-fcd8859-15
SIMSUN.TTF -misc-SimSun-medium-r-normal--0-0-0-0-p-0-iso8859-15
SIMSUN.TTF -misc-SimSun-medium-r-normal--0-0-0-0-p-0-iso8859-1

开头的4指明在这个目录中有4种字体,都存放于SimSun.TTF(宋体)文件中。关于fonts.dir的生成,在http://WWW.joerg-pommnitz.dE/TrueType/ttmkfdir.tar.gz 提供了一个工具 ttmkfdir, 在字体所在目录运行即可。这个工具需要perl 5 和 freetype 1.1,Perl 5一般在Unix平台上都有,freetype1.1在ftp://sunsite.unc.edu/pub/Linux/X11/fonts/freetype-1.1.tar.gz 。再举例几个常用的字体文件名:

SimYou.ttf -ZHUHAI Stone-YouYuan-medium-r-normal--0-0-0-0-m-0-ascii-0 (幼圆)
SimLi.ttf -ZHUHAI Stone-LiSu-medium-r-normal--0-0-0-0-m-0-ascii-0(隶书)
SIMKAI.TTF -misc-KaiTi_GB2312-medium-r-normal--0-0-0-0-p-0-ascii-0(楷体)
SIMHEI.TTF -misc-SimHei-medium-r-normal--0-0-0-0-p-0-ascii-0 (黑体)
SIMFANG.TTF -misc-FangSong_GB2312-medium-r-normal--0-0-0-0-p-0-ascii-0 (仿宋)

接下来修改font.properites文件(如果有相应的中文字体配置文件就更好,替换掉其中非TrueType中文字体,像在HP-UX上就有font.properties.zh_CN,再覆盖font.properties文件),可以定位其中一种字体名,用上面的中文字体名替换,下面是在HP-UX上修改后的fonts.properties部分示例:

serif.plain.0=-adobe-times-medium-r-normal--*-%d-*-*-*-*-iso8859-1
serif.plain.1=-misc-SimSun-medium-r-normal--*-%d-*-*-p-*-iso8859-15
serif.plain.2=-adobe-symbol-medium-r-normal--*-%d-*-*-p-*-adobe-fontspecific
serif.plain.3=-adobe-symbol-medium-r-normal--*-%d-*-*-p-*-adobe-fontspecific

#serif.italic.0=-agfa-cgtimes-medium-i-normal--*-%d-*-*-p-*-iso8859-1
serif.italic.0=-adobe-times-medium-i-normal--*-%d-*-*-*-*-iso8859-1
serif.italic.1=-misc-SimSun-medium-r-normal--*-%d-*-*-p-*-iso8859-15
serif.italic.2=-adobe-symbol-medium-r-normal--*-%d-*-*-p-*-adobe-fontspecific
serif.italic.3=-adobe-symbol-medium-r-normal--*-%d-*-*-p-*-adobe-fontspecific

#serif.bold.0=-agfa-cgtimes-bold-r-normal--*-%d-*-*-p-*-iso8859-1
serif.bold.0=-adobe-times-bold-r-normal--*-%d-*-*-*-*-iso8859-1
serif.bold.1=-misc-SimSun-medium-r-normal--*-%d-*-*-p-*-iso8859-15
serif.bold.2=-adobe-symbol-medium-r-normal--*-%d-*-*-p-*-adobe-fontspecific
serif.bold.3=-adobe-symbol-medium-r-normal--*-%d-*-*-p-*-adobe-fontspecific
。。。
注意字体文件中的-misc-SimSun-medium-r-normal--0-0-0-0-p-0-fcd8859-15在写入font.properties时被改为上面的-misc-SimSun-medium-r-normal--*-%d-*-*-p-*-iso8859-15,以实现TrueType字体的平滑缩放。

运行Java应用程序时,设置环境变量JAVA_FONTS为中文TrueType字体所在目录,如:
export JAVA_FONTS=/usr/lib/X11/fonts/ttfdir

这样,Swing 的中文显示就正常了。

回复
filippo1980 2004-04-28
看一下!
回复
zhwquan 2004-04-28
to joy19(努力前进666),我是生成的图片上的字体显示不了,不是jsp文件哦
回复
joy19 2004-04-28
你用的是什么字体?你应该现写一个xxx.css文件!把字体写在上面!例如:
H1
{
COLOR: black;
FONT-FAMILY: impact
}
H2
{
COLOR: black;
FONT-FAMILY: impact
}
BODY
{
FONT-SIZE: 9pt;
BACKGROUND-IMAGE: url(068.gif);
FONT-FAMILY: "宋体"
}
TABLE
{
BORDER-RIGHT: #ff6600 thin double;
BORDER-TOP: #ff6600 thin double;
FONT-SIZE: 9pt;
BORDER-LEFT: #ff6600 thin double;
BORDER-BOTTOM: #ff6600 thin double;
FONT-FAMILY: "宋体"
}
TD
{
FONT-SIZE: 9pt;
FONT-FAMILY: "宋体"
}
INPUT
{
FONT-SIZE: 12pt;
FONT-FAMILY: "宋体"
}
TEXTAREA
{
FONT-SIZE: 9pt;
FONT-FAMILY: "宋体"
}
SELECT
{
FONT-SIZE: 9pt;
FONT-FAMILY: "宋体"
}
CODE
{
FONT-SIZE: 9pt;
FONT-FAMILY: "Courier","mono"
}
PRE
{
FONT-SIZE: 9pt;
FONT-FAMILY: "Courier","mono"
}
A
{
FONT-SIZE: 12pt;
COLOR: #4499ff;
FONT-FAMILY: "宋体";
TEXT-DECORATION: none
}
A.x
{
COLOR: #ffffff
}
A:hover
{
COLOR: red;
TEXT-DECORATION: underline
}
.head-x
{
FONT-WEIGHT: bold;
FONT-SIZE: 12pt;
FONT-FAMILY: "Verdana", "宋体"
}
.head-xx
{
FONT-WEIGHT: bold;
FONT-SIZE: 10.5pt;
FONT-FAMILY: "Verdana", "宋体"
}
.head-xxx
{
FONT-WEIGHT: bold;
FONT-SIZE: 9pt;
FONT-FAMILY: "Verdana", "宋体"
}
P
{
FONT-SIZE: 15pt;
FONT-FAMILY: "Courier","Verdana", "宋体"
}
P.foot
{
FONT-SIZE: 9pt;
FONT-FAMILY: "宋体"
}
A:link
{
COLOR: #7b68ee;
TEXT-DECORATION: none
}
A .UserManage
{
Z-INDEX: 3;
LEFT: 40pt;
POSITION: absolute;
TOP: 37pt
}
A:visited
{
COLOR: #7b68ee;
TEXT-DECORATION: none
}
A .ProjectManage
{
Z-INDEX: 3;
LEFT: 140pt;
POSITION: absolute;
TOP: 37pt
}
A .VisitManage
{
Z-INDEX: 3;
LEFT: 240pt;
POSITION: absolute;
TOP: 37pt
}
A .RepairManage
{
Z-INDEX: 3;
LEFT: 370pt;
POSITION: absolute;
TOP: 37pt
}
A .PartsManage
{
Z-INDEX: 3;
LEFT: 440pt;
POSITION: absolute;
TOP: 37pt
}
A .Statistic
{
Z-INDEX: 3;
LEFT: 540pt;
POSITION: absolute;
TOP: 37pt
}
A .About
{
Z-INDEX: 3;
LEFT: 640pt;
POSITION: absolute;
TOP: 37pt
}
A:active
{
COLOR: red;
TEXT-DECORATION: none
}
A .lb:hover
{
COLOR: black;
TEXT-DECORATION: underline
}
回复
blue999star 2004-04-28
你把window下的字体 就是那个fonts 拷贝到你linux下的jdk下的fonts目录 在jre\lib\fonts。
试试。
回复
发帖
Web 开发
创建于2007-09-28

8.0w+

社区成员

Java Web 开发
申请成为版主
帖子事件
创建了帖子
2004-04-28 02:22
社区公告
暂无公告