高分求助----关于java生成缩略图的问题!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

cntmi 2009-12-30 11:26:48
由原始图片生成一个大小固定的缩略图(这个程序里只固定了宽度为200)
代码如下:

package com.blz.channel;

import java.awt.Image;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;

import javax.imageio.ImageIO;

import com.sun.image.codec.jpeg.JPEGCodec;
import com.sun.image.codec.jpeg.JPEGImageEncoder;
/**
* 由原始图片来生产其缩略图
* @author zongb
* @date 2009-10-27
*
*/
public class BuildSmallImage {

String fileFullName;
String newFullName ;

public static void main(String [] args){
String oldFileName = "F:\\a.jpg" ;
String newFileName = "F:\\b.jpg" ;
BuildSmallImage bsi = new BuildSmallImage() ;
if(bsi.build(oldFileName, newFileName)){
System.out.println("生成缩略图成功!") ;
}else{
System.out.println("生成缩略图失败!") ;
}
}

public boolean build(String oldFileName,String newFileName) {
this.fileFullName = oldFileName ;//原始文件的全路径
this.newFullName = newFileName ;//新生成文件的全路径
FileOutputStream newimage = null;
try {
File file = new File(fileFullName); // 读入刚才上传的文件
Image src = ImageIO.read(file); // 构造Image对象
//float tagsize = 200; //限制宽度为200
int old_w = src.getWidth(null); // 得到源图宽
int old_h = src.getHeight(null);// 得到源图高

System.out.println("old_w = "+old_w) ;
System.out.println("old_h = "+old_h) ;
float flag_w = 200f ; //限制宽度为200
int new_w = 200; //缩略图宽,
int new_h = 0; //缩略图高
float tempdouble;
if (old_w > new_w) {
tempdouble = old_w / flag_w;
new_w = Math.round(old_w / tempdouble);// 计算缩略图高
new_h = Math.round(old_h / tempdouble);// 计算缩略图高

System.out.println("tempdouble = "+tempdouble) ;
} else {
new_w = old_w ;
new_h = old_h ;
}

System.out.println("new_w = "+new_w) ;
System.out.println("new_h = "+new_h) ;

BufferedImage tag = new BufferedImage(new_w, new_h,BufferedImage.TYPE_INT_RGB);
tag.getGraphics().drawImage(src, 0, 0, new_w, new_h, null); // 绘制缩小后的图

newimage = new FileOutputStream(newFullName);// 输出到文件流
JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(newimage);
encoder.encode(tag); // 近JPEG编码
file.delete() ;//删除原始的图片
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
return false ;
}finally{
if(newimage != null){
try {
newimage.close();
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
}

return true ;

}
}



问题:如果图片的高度都超过200的话,是没有问题的;如果宽度不到200,新生成的缩略图就会拉宽,变成200
这不是我期望的,我希望的是:如果原始图片的宽度不到200,则把原始图片按照一定的比例缩小(比例可以任意设置下),但是要在这个缩小后的图片两边加上一些空白,使得图片宽度变成200

请问怎么实现……
高手请现身
...全文
251 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhaining522 2009-12-31
  • 打赏
  • 举报
回复

import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;

import javax.imageio.ImageIO;

import com.sun.image.codec.jpeg.JPEGCodec;
import com.sun.image.codec.jpeg.JPEGImageEncoder;
/**
* 由原始图片来生产其缩略图
* @author zongb
* @date 2009-10-27
*
*/
public class BuildSmallImage {

String fileFullName;
String newFullName ;

public static void main(String [] args){
String oldFileName = "C://Documents and Settings/nzhai/My Documents/My Pictures/11.jpg" ;
String newFileName = "C://Documents and Settings/nzhai/My Documents/My Pictures/13.jpg" ;
BuildSmallImage bsi = new BuildSmallImage() ;
if(bsi.build(oldFileName, newFileName)){
System.out.println("生成缩略图成功!") ;
}else{
System.out.println("生成缩略图失败!") ;
}
}

public boolean build(String oldFileName,String newFileName) {
this.fileFullName = oldFileName ;//原始文件的全路径
this.newFullName = newFileName ;//新生成文件的全路径
FileOutputStream newimage = null;
try {
File file = new File(fileFullName); // 读入刚才上传的文件
Image src = ImageIO.read(file); // 构造Image对象
//float tagsize = 200; //限制宽度为200
int old_w = src.getWidth(null); // 得到源图宽
int old_h = src.getHeight(null);// 得到源图高

System.out.println("old_w = "+old_w) ;
System.out.println("old_h = "+old_h) ;


int image_H = 140; //生成缩略图的最大高度是 image_H
int image_W = 200; //生成缩略图的最大宽度是 image_W
// float flag_w = 200f ; //限制宽度为200
int new_w = 0; //缩略图宽,
int new_h = 0; //缩略图高
float proportion = (float)image_W/(float)image_H; //缩略图的比例
System.out.println("proportion = "+proportion);
float oldProportion = (float)old_w/(float)old_h; //原图片的比例
System.out.println("oldProportion = "+oldProportion);
if(proportion >= oldProportion){
if(old_h >image_H){
new_h = image_H;
new_w = (int)(new_h*oldProportion);
}else{
new_h = old_h;
new_w = old_w;
}
}else{
if(old_w >image_W){
new_w = image_W;
new_h = (int)(new_w/oldProportion);
}else{
new_h = old_h;
new_w = old_w;
}
}

System.out.println("new_w = "+new_w) ;
System.out.println("new_h = "+new_h) ;

BufferedImage tag = new BufferedImage(image_W, image_H,BufferedImage.TYPE_INT_RGB);
Graphics2D g = (Graphics2D)tag.createGraphics();
g.setBackground(Color.WHITE);
g.clearRect(0,0,image_W,image_H);

tag.getGraphics().drawImage(src, (image_W-new_w)/2, (image_H-new_h)/2, new_w, new_h, null); // 绘制缩小后的图


newimage = new FileOutputStream(newFullName);// 输出到文件流
JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(newimage);
encoder.encode(tag); // 近JPEG编码
//file.delete() ;//删除原始的图片
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
return false ;
}finally{
if(newimage != null){
try {
newimage.close();
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
}

return true ;

}
}



恩 这次应该是你要的结果了。。。
zl3450341 2009-12-30
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 cntmi 的回复:]
引用 4 楼 zhaining522 的回复:
我这没问题呀。。。。

忘了说明,程序我改了下,现在的处理时宽度少于200,就不再缩略了,直接按原来的宽度和高度重新生成一份副本而已!
[/Quote]
没做过
看你这样说 就加个条件啊 当宽度小于200时 就不缩了
swandragon 2009-12-30
  • 打赏
  • 举报
回复
图像加空白?程序不会
ps
cntmi 2009-12-30
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 zhaining522 的回复:]
我这没问题呀。。。。
[/Quote]
忘了说明,程序我改了下,现在的处理时宽度少于200,就不再缩略了,直接按原来的宽度和高度重新生成一份副本而已!
cntmi 2009-12-30
  • 打赏
  • 举报
回复
各位论坛或民间高手帮帮忙哈,需求就是在图片两边加一些空白,变成一个新图片
!!!!!!!!
zhaining522 2009-12-30
  • 打赏
  • 举报
回复
我这没问题呀。。。。
  • 打赏
  • 举报
回复
这个


祝福吧 最近懒了
hzq237 2009-12-30
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 ymdcr 的回复:]
没做过
给你顶
[/Quote]
一样
牛叔 2009-12-30
  • 打赏
  • 举报
回复
没做过
给你顶
cntmi 2009-12-30
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 zhaining522 的回复:]
Java codepackage nio;import java.awt.Color;import java.awt.Graphics;import java.awt.Graphics2D;import java.awt.Image;import java.awt.image.BufferedImage;import java.io.File;import java.io.FileOutputStream;import java.io.IOException;import javax.imageio.ImageIO;import com.sun.image.codec.jpeg.JPEGCodec;import com.sun.image.codec.jpeg.JPEGImageEncoder;/**
* 由原始图片来生产其缩略图
*@author zongb
* @date 2009-10-27
**/publicclass BuildSmallImage {

String fileFullName;
String newFullName ;publicstaticvoid main(String [] args){
String oldFileName="C://Documents and Settings/nzhai/My Documents/My Pictures/12.jpg" ;
String newFileName="C://Documents and Settings/nzhai/My Documents/My Pictures/13.jpg" ;
BuildSmallImage bsi=new BuildSmallImage() ;if(bsi.build(oldFileName, newFileName)){
System.out.println("生成缩略图成功!") ;
}else{
System.out.println("生成缩略图失败!") ;
}
}publicboolean build(String oldFileName,String newFileName) {this.fileFullName= oldFileName ;//原始文件的全路径this.newFullName= newFileName ;//新生成文件的全路径 FileOutputStream newimage=null;try {
File file=new File(fileFullName);// 读入刚才上传的文件 Image src= ImageIO.read(file);// 构造Image对象//float tagsize = 200;//限制宽度为200int old_w= src.getWidth(null);// 得到源图宽int old_h= src.getHeight(null);// 得到源图高
System.out.println("old_w ="+old_w) ;
System.out.println("old_h ="+old_h) ;float flag_w= 200f ;//限制宽度为200int new_w=200;//缩略图宽,int new_h=0;//缩略图高float tempdouble;if (old_w> new_w) {
tempdouble= old_w/ flag_w;
new_w= Math.round(old_w/ tempdouble);// 计算缩略图高 new_h= Math.round(old_h/ tempdouble);// 计算缩略图高
System.out.println("tempdouble ="+tempdouble) ;
}else {
new_w= old_w ;
new_h= old_h ;
}

int image_H=140;int image_W=200;

System.out.println("new_w ="+new_w) ;
System.out.println("new_h ="+new_h) ;

BufferedImage tag=new BufferedImage(image_W, image_H,BufferedImage.TYPE_INT_RGB);

Graphics2D g= (Graphics2D)tag.createGraphics();
g.setBackground(Color.WHITE);
g.clearRect(0,0,image_W,image_H);


tag.getGraphics().drawImage(src, (image_W-old_w)/2, (image_H-new_h)/2, new_w, new_h,null);// 绘制缩小后的图
newimage=new FileOutputStream(newFullName);// 输出到文件流 JPEGImageEncoder encoder= JPEGCodec.createJPEGEncoder(newimage);
encoder.encode(tag);// 近JPEG编码//file.delete() ;//删除原始的图片 }catch (Exception e) {// TODO Auto-generated catch block e.printStackTrace();returnfalse ;
}finally{if(newimage!=null){try {
newimage.close();
}catch (IOException e1) {// TODO Auto-generated catch block e1.printStackTrace();
}
}
}returntrue ;

}
}

这样应该是你要的效果吧?

[/Quote]

这个是实现了两边增加空白的效果,但是图片没有所有,而是截取了……
我想能缩小图片同是增加空白
zhaining522 2009-12-30
  • 打赏
  • 举报
回复

package nio;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;

import javax.imageio.ImageIO;

import com.sun.image.codec.jpeg.JPEGCodec;
import com.sun.image.codec.jpeg.JPEGImageEncoder;
/**
* 由原始图片来生产其缩略图
* @author zongb
* @date 2009-10-27
*
*/
public class BuildSmallImage {

String fileFullName;
String newFullName ;

public static void main(String [] args){
String oldFileName = "C://Documents and Settings/nzhai/My Documents/My Pictures/12.jpg" ;
String newFileName = "C://Documents and Settings/nzhai/My Documents/My Pictures/13.jpg" ;
BuildSmallImage bsi = new BuildSmallImage() ;
if(bsi.build(oldFileName, newFileName)){
System.out.println("生成缩略图成功!") ;
}else{
System.out.println("生成缩略图失败!") ;
}
}

public boolean build(String oldFileName,String newFileName) {
this.fileFullName = oldFileName ;//原始文件的全路径
this.newFullName = newFileName ;//新生成文件的全路径
FileOutputStream newimage = null;
try {
File file = new File(fileFullName); // 读入刚才上传的文件
Image src = ImageIO.read(file); // 构造Image对象
//float tagsize = 200; //限制宽度为200
int old_w = src.getWidth(null); // 得到源图宽
int old_h = src.getHeight(null);// 得到源图高

System.out.println("old_w = "+old_w) ;
System.out.println("old_h = "+old_h) ;
float flag_w = 200f ; //限制宽度为200
int new_w = 200; //缩略图宽,
int new_h = 0; //缩略图高
float tempdouble;
if (old_w > new_w) {
tempdouble = old_w / flag_w;
new_w = Math.round(old_w / tempdouble);// 计算缩略图高
new_h = Math.round(old_h / tempdouble);// 计算缩略图高

System.out.println("tempdouble = "+tempdouble) ;
} else {
new_w = old_w ;
new_h = old_h ;
}

int image_H = 140;
int image_W = 200;


System.out.println("new_w = "+new_w) ;
System.out.println("new_h = "+new_h) ;

BufferedImage tag = new BufferedImage(image_W, image_H,BufferedImage.TYPE_INT_RGB);

Graphics2D g = (Graphics2D)tag.createGraphics();
g.setBackground(Color.WHITE);
g.clearRect(0,0,image_W,image_H);


tag.getGraphics().drawImage(src, (image_W-old_w)/2, (image_H-new_h)/2, new_w, new_h, null); // 绘制缩小后的图

newimage = new FileOutputStream(newFullName);// 输出到文件流
JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(newimage);
encoder.encode(tag); // 近JPEG编码
//file.delete() ;//删除原始的图片
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
return false ;
}finally{
if(newimage != null){
try {
newimage.close();
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
}

return true ;

}
}



这样应该是你要的效果吧?
YBBPS1109 2009-12-30
  • 打赏
  • 举报
回复
BufferedImage tag = new BufferedImage(new_w, new_h,BufferedImage.TYPE_INT_ARGB);
BufferedImage.TYPE_INT_ARGB
苍蝇①号 2009-12-30
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 zl3450341 的回复:]
引用 6 楼 cntmi 的回复:
引用 4 楼 zhaining522 的回复:
我这没问题呀。。。。

忘了说明,程序我改了下,现在的处理时宽度少于200,就不再缩略了,直接按原来的宽度和高度重新生成一份副本而已!

没做过
看你这样说  就加个条件啊  当宽度小于200时  就不缩了
[/Quote]
支持
cntmi 2009-12-30
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 zl3450341 的回复:]
引用 6 楼 cntmi 的回复:
引用 4 楼 zhaining522 的回复:
我这没问题呀。。。。

忘了说明,程序我改了下,现在的处理时宽度少于200,就不再缩略了,直接按原来的宽度和高度重新生成一份副本而已!

没做过
看你这样说  就加个条件啊  当宽度小于200时  就不缩了
[/Quote]
我上面说的只是现在程序的处理方法,我希望的处理方法是,图片宽度小于200时,照样缩小,只是在缩小后把图片的两边加上空白,使图片的宽度变成200

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧