BufferedImage类有一个getSubimage()方法,以下来自API
创新互联是专业的新罗网站建设公司,新罗接单;提供成都网站建设、成都网站设计,网页设计,网站设计,建网站,PHP网站建设等专业做网站服务;采用PHP框架,可快速的进行新罗网站开发网页制作和功能扩展;专业做搜索引擎喜爱的网站,专业的做网站团队,希望更多企业前来合作!
public BufferedImage getSubimage(int x,
int y,
int w,
int h)
返回由指定矩形区域定义的子图像。返回的 BufferedImage 与源图像共享相同的数据数组。
参数:
x - 指定矩形区域左上角的 X 坐标
y - 指定矩形区域左上角的 Y 坐标
w - 指定矩形区域的宽度
h - 指定矩形区域的高度
返回:
BufferedImage,它是此 BufferedImage 的子图像。
抛出:
RasterFormatException - 如果指定区域不包含在此 BufferedImage 中
//用基本图形拼呀
import java.awt.Graphics;
import javax.swing.*;
public class IrregulaShape extends JPanel{
@Override
public void paint(Graphics g) {
super.paint(g);
g.drawRect(100, 50,100, 100);
g.drawArc(100, 25, 50, 50, 0, 180);
// g.fillRect(100, 50, 100, 100);
// g.fillOval(100, 25, 50, 50);
}
public static void main(String[] args) {
JFrame jFrame = new JFrame("不规则的!");
IrregulaShape j = new IrregulaShape();
jFrame.add(j);
jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jFrame.setSize(500,500);
jFrame.setLocationRelativeTo(null);
jFrame.setVisible(true);
}
}
怎么会无法呢。java支持图片格式中最好的就是png,别的图片可以不支持,png是默认支持的。用ARGB色彩模型直接对png操作即可,
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
public class Test {
static public void main(String 参数[]){
try{
BufferedImage img=ImageIO.read(new File("test.png"));
int half_w=img.getWidth()/2;
int rgb[]=new int[half_w*img.getHeight()];
img.getRGB(0, 0, half_w, img.getHeight(), rgb, 0, half_w);
BufferedImage img_half=new BufferedImage(half_w, img.getHeight(), BufferedImage.TYPE_INT_ARGB);
img_half.setRGB(0, 0,half_w,img.getHeight(), rgb,0,half_w);
//保存到新文件half.png里面
ImageIO.write(img_half,"PNG",new File("half.png"));
}catch (IOException e){
e.printStackTrace();
}
}
}
======
得到half.png签名图的左半边,保留了透明的背景。
这已经只有5-6行,抛砖引玉,用raster可能代码更简..
package com.supben.util;
import java.awt.Dimension;
import java.awt.Image;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Iterator;
import javax.imageio.ImageIO;
import javax.imageio.ImageReadParam;
import javax.imageio.ImageReader;
import javax.imageio.stream.ImageInputStream;
import org.apache.log4j.Logger;
import com.sun.image.codec.jpeg.JPEGCodec;
import com.sun.image.codec.jpeg.JPEGEncodeParam;
import com.sun.image.codec.jpeg.JPEGImageEncoder;
public class ImageUtil {
private static final Logger log = Logger.getLogger(ImageUtil.class);
/**
* 切割图片
* @param x 截点横坐标 (从左开始计数)
* @param y 截点纵坐标 (从上开始计数)
* @param width 截取的宽度
* @param height 截取的长度
* @param oldpath 图片位置
* @param newpath 新生成的图片位置
*/
public static void cutImage(int x, int y, int width, int height, String oldpath, String newpath) {
FileInputStream is = null;
ImageInputStream iis = null;
//这个是获取图片扩展名的方法,比如:jpg。我这里有现成的,如果没有,自己实现
String imgType = StringUtil.getExt(oldpath);
try {
is = new FileInputStream(oldpath);
IteratorImageReader it = ImageIO.getImageReadersByFormatName(imgType);
ImageReader reader = it.next();
iis = ImageIO.createImageInputStream(is);
reader.setInput(iis, true);
ImageReadParam param = reader.getDefaultReadParam();
Point p = new Point();
p.setLocation(x, y);
Dimension d = new Dimension();
d.setSize(width, height);
Rectangle rect = new Rectangle(p, d);
param.setSourceRegion(rect);
BufferedImage bi = reader.read(0, param);
ImageIO.write(bi, imgType, new File(newpath));
is.close();
iis.close();
} catch (Exception e) {
log.error(e);
}
}
/**
* 缩略图片
* @param oldpath 原图片
* @param newpath 新生成的图片存放地址
* @param wdith 缩略后的宽
* @param height 缩略后的高
*/
public static void scaleImage(String oldpath, String newpath, int wdith, int height) {
// 获取老的图片
File oldimg = new File(oldpath);
try {
BufferedImage bi = ImageIO.read(oldimg);
Image Itemp = bi.getScaledInstance(wdith, height, BufferedImage.SCALE_SMOOTH);
BufferedImage thumbnail = new BufferedImage(wdith, height, BufferedImage.TYPE_INT_RGB);
thumbnail.getGraphics().drawImage(Itemp, 0, 0, null);
// 缩略后的图片路径
File newimg = new File(newpath);
FileOutputStream out = new FileOutputStream(newimg);
// 绘图
JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
JPEGEncodeParam param = encoder.getDefaultJPEGEncodeParam(thumbnail);
param.setQuality(1.0f, false);
encoder.encode(thumbnail);
out.close();
bi.flush();
bi = null;
} catch (IOException e) {
log.error(e);
}
}
public static void main(String[] args) {
scaleImage("D:/2.jpg", "D:/3.jpg", 50, 50);
}
}