最近在做一个上传图片后,对该图片进行截图的功能
客户那边给的是5000+ * 3000+的分辨率高清图片,但是一截图后,截完的图片会出现一些锯齿,java有没有一种截图的方法
能不出现锯齿的。。
截图代码如下 public static void alterSize(String srcImgFile, String savePath, int new_w,int new_h) {
File file = new File(srcImgFile);
if (!file.exists())
System.out.println("文件不存在");
String newUrlName = savePath;// 截完过后存放的路径
Image src = null;
try {
src = javax.imageio.ImageIO.read(file);
java.awt.image.BufferedImage tag = new java.awt.image.BufferedImage(
new_w, new_h, java.awt.image.BufferedImage.TYPE_INT_RGB);
tag.getGraphics().drawImage(src, 0, 0, new_w, new_h, null);
FileOutputStream newimage = new FileOutputStream(newUrlName);
ImageIO.write(tag,"jpg",new File(newUrlName ));
newimage.close(); } catch (IIOException ee) {
ee.printStackTrace();
System.out.print("这里出错了");
} catch (Exception e) {
e.printStackTrace();
}
}
客户那边给的是5000+ * 3000+的分辨率高清图片,但是一截图后,截完的图片会出现一些锯齿,java有没有一种截图的方法
能不出现锯齿的。。
截图代码如下 public static void alterSize(String srcImgFile, String savePath, int new_w,int new_h) {
File file = new File(srcImgFile);
if (!file.exists())
System.out.println("文件不存在");
String newUrlName = savePath;// 截完过后存放的路径
Image src = null;
try {
src = javax.imageio.ImageIO.read(file);
java.awt.image.BufferedImage tag = new java.awt.image.BufferedImage(
new_w, new_h, java.awt.image.BufferedImage.TYPE_INT_RGB);
tag.getGraphics().drawImage(src, 0, 0, new_w, new_h, null);
FileOutputStream newimage = new FileOutputStream(newUrlName);
ImageIO.write(tag,"jpg",new File(newUrlName ));
newimage.close(); } catch (IIOException ee) {
ee.printStackTrace();
System.out.print("这里出错了");
} catch (Exception e) {
e.printStackTrace();
}
}
解决方案 »
- Spring,Struts,Hibernate框架配置双数据源
- hibreate映射List集合,如何获取List集合中的值
- 求教FTP下载问题
- 用window.showModalDialog()打开的窗口中第一个输入框会自动获得焦点
- validator页面验证 急!!!!!!!!!!
- struts+hibernate实现用户管理出现的问题
- 大家帮帮忙看看有没有办法实现
- HIBERNATE 的外键问题,请大家帮忙!
- resin+mysql+hibernate运行错误,请帮我看看
- 哪里有J2EE编程指南1.3版的英文电子版下载?
- Hibernate最菜的联合查询报for input String
- SSH,如何用myeclipse中如何自动生成DAO接口和DAO的实现类?
tag.getGraphics().drawImage(src, 0, 0, new_w, new_h, null);
这里不就是截取src的部分吗
对啊 这个是缩略的方法并没有截图啊
使用Graphics2D 做抗锯齿应该可以吧 Graphics2D g2d = (Graphics2D)tag.getGraphics();
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
g2d.drawImage(src, 0, 0, new_w, new_h, null);
bi.getScaledInstance(width, height,
Image.SCALE_AREA_AVERAGING), 0, 0, null);
* 图片缩小
* @param imgsrc 原图片路径
* @param imgdist 缩小后的图片路径
* @param widthdist 宽度
* @param heightdist 高度
*/
public static void reduceImg(String imgsrc, String imgdist, int widthdist, int heightdist) {
try {
File srcfile = new File(imgsrc);
if (!srcfile.exists()) {
return;
}
Image src = javax.imageio.ImageIO.read(srcfile);
BufferedImage tag= new BufferedImage((int) widthdist, (int) heightdist,BufferedImage.TYPE_INT_RGB);
tag.getGraphics().drawImage(src.getScaledInstance(widthdist, heightdist, Image.SCALE_SMOOTH), 0, 0, null);
FileOutputStream out = new FileOutputStream(imgdist);
JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
encoder.encode(tag);
out.close();
} catch (IOException ex) {
ex.printStackTrace();
}
}
测试方式
public static void main(String trg[])
{
LessenImage l=new LessenImage();
String imgsrc="D:/cdgxManFaceImage/Fet_load/200912211732010968101.JPG";
String imgdist="D:/cdgxManFaceImage/Fet_load/Fet_source/200912211732010968101";
l.reduceImg(imgsrc, imgdist, 400, 300);
}
/**
* 对图片实现剪裁
* @author Administrator
*
*/
public class OperateImage {
//===源图片路径名称如:c:\1.jpg
private String srcpath ;
//===剪切图片存放路径名称.如:c:\2.jpg
private String subpath ;
//===剪切点x坐标
private int x ;
private int y ;
//===剪切点宽度
private int width;
private int height;
public OperateImage(){
}
public OperateImage(int x,int y,int width,int height){
this.x = x ;
this.y = y ;
this.width = width ;
this.height = height ;
}
/** *//**
* 对图片裁剪,并把裁剪完蛋新图片保存 。
*/
public void cut() throws IOException{
FileInputStream is = null ;
ImageInputStream iis =null ;
try{
//读取图片文件
is = new FileInputStream(srcpath);
/**//*
* 返回包含所有当前已注册 ImageReader 的 Iterator,这些 ImageReader
* 声称能够解码指定格式。 参数:formatName - 包含非正式格式名称 .
*(例如 "jpeg" 或 "tiff")等 。
*/
Iterator<ImageReader> it = ImageIO.getImageReadersByFormatName("jpg");
ImageReader reader = it.next();
//获取图片流
iis = ImageIO.createImageInputStream(is);
/**//*
* <p>iis:读取源.true:只向前搜索 </p>.将它标记为 ‘只向前搜索’。
* 此设置意味着包含在输入源中的图像将只按顺序读取,可能允许 reader
* 避免缓存包含与以前已经读取的图像关联的数据的那些输入部分。
*/
reader.setInput(iis,true) ;
/**//*
* <p>描述如何对流进行解码的类<p>.用于指定如何在输入时从 Java Image I/O
* 框架的上下文中的流转换一幅图像或一组图像。用于特定图像格式的插件
* 将从其 ImageReader 实现的 getDefaultReadParam 方法中返回
* ImageReadParam 的实例。
*/
ImageReadParam param = reader.getDefaultReadParam();
/**//*
* 图片裁剪区域。Rectangle 指定了坐标空间中的一个区域,通过 Rectangle 对象
* 的左上顶点的坐标(x,y)、宽度和高度可以定义这个区域。
*/
Rectangle rect = new Rectangle(x, y, width, height);
//提供一个 BufferedImage,将其用作解码像素数据的目标。
param.setSourceRegion(rect);
/**//*
* 使用所提供的 ImageReadParam 读取通过索引 imageIndex 指定的对象,并将
* 它作为一个完整的 BufferedImage 返回。
*/
BufferedImage bi = reader.read(0,param);
//保存新图片
ImageIO.write(bi, "jpg", new File(subpath));
//删除原图片
new File(srcpath).delete();
}
finally{
if(is!=null)
is.close() ;
if(iis!=null)
iis.close();
}
} public int getHeight() {
return height;
} public void setHeight(int height) {
this.height = height;
} public String getSrcpath() {
return srcpath;
} public void setSrcpath(String srcpath) {
this.srcpath = srcpath;
} public String getSubpath() {
return subpath;
} public void setSubpath(String subpath) {
this.subpath = subpath;
} public int getWidth() {
return width;
} public void setWidth(int width) {
this.width = width;
} public int getX() {
return x;
} public void setX(int x) {
this.x = x;
} public int getY() {
return y;
} public void setY(int y) {
this.y = y;
}
//测试方式
public static void main(String[] args)throws Exception{
String name = "D:/cdgxManFaceImage/Fet_load/200912211732010968101.JPG";
OperateImage o = new OperateImage(1000,1000,100,100);
o.setSrcpath(name);
o.setSubpath("D:/2.jpg");
o.cut() ;
}