import java.awt.Color
import java.awt.Font
import java.awt.Graphics
import java.awt.image.BufferedImage
import java.io.File
import java.io.IOException
import javax.imageio.ImageIO
/**
* 图片 *** 作类
*
* @author
*
*/
public class ImageUtil {
private BufferedImage image
private int width // 图片宽度
private int height // 图片高度
public ImageUtil(int width, int height) {
this.width = width
this.height = height
image = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB)
}
/**
* 创建一个含有指定颜色字符串的图片
*
* @param message
* 字符串
* @param fontSize
* 字体大小
* @param color
* 字体颜色
* @return 图片
*/
public BufferedImage drawString(String message, int fontSize, Color color) {
Graphics g = image.getGraphics()
g.setColor(color)
Font f = new Font("宋体", Font.BOLD, fontSize)
g.setFont(f)
int len = message.length()
g.drawString(message, (width - fontSize * len) / 2,
(height + (int) (fontSize / 1.5)) / 2)
g.dispose()
return image
}
/**
* 缩放图片
*
* @param scaleW
* 水平缩放比例
* @param scaleY
* 垂直缩放比例
* @return
*/
public BufferedImage scale(double scaleW, double scaleH) {
width = (int) (width * scaleW)
height = (int) (height * scaleH)
BufferedImage newImage = new BufferedImage(width, height,
image.getType())
Graphics g = newImage.getGraphics()
g.drawImage(image, 0, 0, width, height, null)
g.dispose()
image = newImage
return image
}
/**
* 旋转90度旋转
*
* @return 对应图片
*/
public BufferedImage rotate() {
BufferedImage dest = new BufferedImage(height, width,
BufferedImage.TYPE_INT_ARGB)
for (int i = 0 i < width i++)
for (int j = 0 j < height j++) {
dest.setRGB(height - j - 1, i, image.getRGB(i, j))
}
image = dest
return image
}
/**
* 合并两个图像
*
* @param anotherImage
* 另一张图片
* @return 合并后的图片,如果两张图片尺寸不一致,则返回null
*/
public BufferedImage mergeImage(BufferedImage anotherImage) {
int w = anotherImage.getWidth()
int h = anotherImage.getHeight()
if (w != width || h != height) {
return null
}
for (int i = 0 i < w i++) {
for (int j = 0 j < h j++) {
int rgb1 = image.getRGB(i, j)
int rgb2 = anotherImage.getRGB(i, j)
Color color1 = new Color(rgb1)
Color color2 = new Color(rgb2)
// 如果该位置两张图片均没有字体经过,则跳过
// 如果跳过,则最后将会是黑色背景
if (color1.getRed() + color1.getGreen() + color1.getBlue()
+ color2.getRed() + color2.getGreen()
+ color2.getBlue() == 0) {
continue
}
Color color = new Color(
(color1.getRed() + color2.getRed()) / 2,
(color1.getGreen() + color2.getGreen()) / 2,
(color1.getBlue() + color2.getBlue()) / 2)
image.setRGB(i, j, color.getRGB())
}
}
return image
}
/**
* 保存图片int rgb1 = image.getRGB(i, j) int rgb2 = anotherImage.getRGB(i, j)
* rgb2 = rgb1 & rgb2 image.setRGB(height - i, j, rgb2)
*
* @param filePath
* 图片路径
*/
public void save(String filePath) {
try {
ImageIO.write(image, "png", new File(filePath))
} catch (IOException e) {
e.printStackTrace()
}
}
/**
* 得到对应的图片
*
* @return
*/
public BufferedImage getImage() {
return image
}
}
// 读取模板图片内容BufferedImage image = ImageIO.read(new FileInputStream("c:\\test.jpg"))
Graphics2D g = image.createGraphics()// 得到图形上下文
g.setColor(Color.BLACK)// 设置画笔颜色
// 设置字体
g.setFont(new Font("宋体", Font.LAYOUT_LEFT_TO_RIGHT, 15))// 写入签名
// 下面这一句中的43,image.getHeight()-10可以改成你要的坐标。
g.drawString("这是新加入的文字", 43, image.getHeight() - 10)
g.dispose()
FileOutputStream out = new FileOutputStream("c:\\test1.jpg")
JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out)
encoder.encode(image)
out.close()
希望我的回答能帮助你 谢谢 呵呵答案补充 肯定了 在一张纸上写字 肯定会自动换行的 否则写外面?逻辑都通不过去~ 答案补充 把你的意思说出了 是不是随便的写字然后就提交 就把字写在了图片上还是?多少字 有没有约束? 答案补充 g.drawString("这是新加入的文字", 43, image.getHeight() - 10)
在这个做处理 你规定了字体的大小 那么获取字符的长度*大小 一次判断不要大于宽度 否则image.getHeight() - 10++ 你试试 应该可以的 我这里没有Eclipse 答案补充 public class mains {
/**
* @param args
*/
private static int fontsize = 15
static String jj(String str)
{
String sContent = str
sContent=sContent.replaceAll(" "," ")
sContent=sContent.replaceAll("<br/>","/")
sContent=sContent.replaceAll("<br>","/")
return sContent
} 答案补充 static void hh(String str)
{
BufferedImage image
try {
image = ImageIO.read(new FileInputStream("E:\\dian zi za zhi/789.jpg"))
Graphics2D g = image.createGraphics()// 得到图形上下文
g.setColor(Color.BLACK)// 设置画笔颜色
// 设置字体
g.setFont(new Font("宋体", Font.LAYOUT_LEFT_TO_RIGHT, fontsize))// 写入签名
// 下面这一句中的43,image.getHeight()-10可以改成你要的坐标。
String text = jj(str) 答案补充 String [] text1 = text.split("/")
int h = image.getHeight()
int w = image.getWidth()
for(int i=0i<text1.lengthi++)
{
g.drawString(text1[i],0,fontsize+i*fontsize)
}
g.dispose()
FileOutputStream out = new FileOutputStream("E:\\dian zi za zhi/789.jpg")
JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out)
encoder.encode(image)
out.close() 答案补充 public static void main(String[] args) {
// TODO Auto-generated method stub
hh("sdakljsdhww<br/>asdasd<br/>a")
}
}
试试 可以换行 答案补充 关于 图片的尺寸以及字体是否超出 你自己试着解决下 不要过于依赖问
先用java.awt.Graphics2D.getFont()取得当前正在使用的字体f,java.awt.Graphics2D.getFontRenderContext()取得当前正在使用的渲染上下文frc然后再用Rectangle2D rect=f.getStringBounds(str,frc)就可以得到你渲染这些文字所占据的矩形,使用rect.getWidth(), rect,getHeight()就可以知道这个矩形的大小了。
反过来通过像素大小决定字符串的长度没有现成的方法。如果你的字体是等宽的可以先用上面的方法求出一个字符的大小然后自己算,不然就只能先试试一个字符,再试试两个字符……直到超过你要的长度就返回的办法了(看起来效率比较低,不过实际使用的时候不是很影响性能)
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)