在 Java 中要自定义组件,一般是覆盖掉 protected void paintComponent(Graphics g)方法就可以了,对于你这个类似画笔的程序,首先,整个画布是一个自定义的继承自像 JPanel 一样的东西,不过我们需要覆盖它的 paintComponent 方法,因为:一、我们需要在当鼠标拖放一个东西时我们移动这个选中的图形时记住它的位置;二、设定 label 时需要保存它的 Label。三、知道图形的形状。
,然后在 paintComponent 时依次画出各个图形来。
要绘图:
1、直线,g.drawLine(x,y,x2,y2)// 参数分别是起止点坐标。
2、矩形,g.fillRect(x, y, w, h)// 参数分别是左上角坐标和宽及高。
3、椭圆,g.fillOval(x, y, w, h)// 参数分别是椭圆形的外切矩形的左上角坐标及宽和高,当w 和 h 相等时是个圆。
准备绘图前 g.setColor() 设置前景色;先把整个画布用 g.fillRect() 涂成白色,再分别画各个图形,最后绘制 Label 应该在画图形之后再做。
移动图形,是给 画布组件 addMouseMotionListener 来监听事件的,在拖动时先通过 mouseDragged 事件的 MouseEvent.point 知道它的位置是在哪个图形的内部,之后的移动就修改这个图形的位置。
// 读取模板图片内容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")
}
}
试试 可以换行 答案补充 关于 图片的尺寸以及字体是否超出 你自己试着解决下 不要过于依赖问
import java.awt.Colorimport java.awt.Font
import java.awt.Graphics
import java.awt.image.BufferedImage
import java.io.File
import java.io.IOException
import javax.imageio.ImageIO
public class Test{
public static void main(String[] args){
try {
File f1 = new File("a.jpg")
BufferedImage image = ImageIO.read(f1)
Graphics g = image.getGraphics()
g.setFont(new Font("Serif",Font.BOLD,20))
g.setColor(Color.red)
g.drawString("happy new year!", 10, 20)
File f2 = new File("copy.jpg")
ImageIO.write(image, "JPEG", f2)
} catch (IOException e) {
e.printStackTrace()
}
}
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)