圖像的縮略代碼
//Image image = ImageIO.read(is);
Image src=Toolkit.getDefaultToolkit().getImage(file.getPath());//可讀取丟失ICC信息的圖片
BufferedImage image=BufferedImageBuilder.toBufferedImage(src);//Image to BufferedImage
int w=image.getWidth(null);
int h=image.getHeight(null);
//縮略圖的size
int size=getFileSize(flag);
if(size==0)size=h;
int nw=size;
int nh=(nw*h)/w;
if(nh>size){
nh=size;
nw=(nh*w)/h;
}
BufferedImage tag=new BufferedImage(nw,nh,BufferedImage.TYPE_INT_RGB);
tag.getGraphics().drawImage(image.getScaledInstance(nw, nh, Image.SCALE_SMOOTH), 0, 0, null);
FileOutputStream out=new FileOutputStream(imageFile);
JPEGImageEncoder encoder=JPEGCodec.createJPEGEncoder(out);
encoder.encode(tag);
out.close();
以下是Image轉換BufferedImage代碼
public static BufferedImage toBufferedImage(Image image) {
if (image instanceof BufferedImage) {
return (BufferedImage)image;
}
// This code ensures that all the pixels in the image are loaded
image = new ImageIcon(image).getImage();
// Determine if the image has transparent pixels; for this method's
// implementation, see e661 Determining If an Image Has Transparent Pixels
//boolean hasAlpha = hasAlpha(image);
// Create a buffered image with a format that's compatible with the screen
BufferedImage bimage = null;
GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
try {
// Determine the type of transparency of the new buffered image
int transparency = Transparency.OPAQUE;
/* if (hasAlpha) {
transparency = Transparency.BITMASK;
}*/
// Create the buffered image
GraphicsDevice gs = ge.getDefaultScreenDevice();
GraphicsConfiguration gc = gs.getDefaultConfiguration();
bimage = gc.createCompatibleImage(
image.getWidth(null), image.getHeight(null), transparency);
} catch (HeadlessException e) {
// The system does not have a screen
}
if (bimage == null) {
// Create a buffered image using the default color model
int type = BufferedImage.TYPE_INT_RGB;
//int type = BufferedImage.TYPE_3BYTE_BGR;//by wang
/*if (hasAlpha) {
type = BufferedImage.TYPE_INT_ARGB;
}*/
bimage = new BufferedImage(image.getWidth(null), image.getHeight(null), type);
}
// Copy image to buffered image
Graphics g = bimage.createGraphics();
// Paint the image onto the buffered image
g.drawImage(image, 0, 0, null);
g.dispose();
return bimage;
}
if (image instanceof BufferedImage) {
return (BufferedImage)image;
}
// This code ensures that all the pixels in the image are loaded
image = new ImageIcon(image).getImage();
// Determine if the image has transparent pixels; for this method's
// implementation, see e661 Determining If an Image Has Transparent Pixels
//boolean hasAlpha = hasAlpha(image);
// Create a buffered image with a format that's compatible with the screen
BufferedImage bimage = null;
GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
try {
// Determine the type of transparency of the new buffered image
int transparency = Transparency.OPAQUE;
/* if (hasAlpha) {
transparency = Transparency.BITMASK;
}*/
// Create the buffered image
GraphicsDevice gs = ge.getDefaultScreenDevice();
GraphicsConfiguration gc = gs.getDefaultConfiguration();
bimage = gc.createCompatibleImage(
image.getWidth(null), image.getHeight(null), transparency);
} catch (HeadlessException e) {
// The system does not have a screen
}
if (bimage == null) {
// Create a buffered image using the default color model
int type = BufferedImage.TYPE_INT_RGB;
//int type = BufferedImage.TYPE_3BYTE_BGR;//by wang
/*if (hasAlpha) {
type = BufferedImage.TYPE_INT_ARGB;
}*/
bimage = new BufferedImage(image.getWidth(null), image.getHeight(null), type);
}
// Copy image to buffered image
Graphics g = bimage.createGraphics();
// Paint the image onto the buffered image
g.drawImage(image, 0, 0, null);
g.dispose();
return bimage;
}
以上的方法可以生成品質較高無鋸齒的新圖像文件
還有以下方法生成縮略圖的,如果是圖像失真較大, 圖形可以用以下方法
//BufferedImage src = ImageIO.read(is);
Image image=Toolkit.getDefaultToolkit().getImage(file.getPath());//用它可以讀取丟失ICC信息的圖片
BufferedImageBuilder bib=new BufferedImageBuilder();
BufferedImage src=BufferedImageBuilder.toBufferedImage(image);
//BufferedImage src=bib.bufferImage(image);
int w=src.getWidth();
int h=src.getHeight();
int size=getFileSize(flag);
if(size==0)size=h;
int nw=size;
int nh=(nw*h)/w;
if(nh>size){
nh=size;
nw=(nh*w)/h;
}
//縮圖的比例
double sx=(double)nw/w;
double sy=(double)nh/h;
AffineTransform transform=new AffineTransform();
transform.setToScale(sx, sy);
AffineTransformOp ato=new AffineTransformOp(transform,null);
int type=src.getColorModel().getColorSpace().getType();
if(type==5){
//type=BufferedImage.TYPE_3BYTE_BGR;
type=BufferedImage.TYPE_INT_RGB;
}else if(type==6){
type=BufferedImage.TYPE_BYTE_GRAY;
}
BufferedImage tag=new BufferedImage(nw, nh,type);
ato.filter(src, tag);
if(isGray&&type!=6){
//生成灰色圖片
tag=getGrayImage(tag);
}
ImageIO.write(tag, "jpeg", imageFile);
tag.flush();
src.flush();
is.close();
Image image=Toolkit.getDefaultToolkit().getImage(file.getPath());//用它可以讀取丟失ICC信息的圖片
BufferedImageBuilder bib=new BufferedImageBuilder();
BufferedImage src=BufferedImageBuilder.toBufferedImage(image);
//BufferedImage src=bib.bufferImage(image);
int w=src.getWidth();
int h=src.getHeight();
int size=getFileSize(flag);
if(size==0)size=h;
int nw=size;
int nh=(nw*h)/w;
if(nh>size){
nh=size;
nw=(nh*w)/h;
}
//縮圖的比例
double sx=(double)nw/w;
double sy=(double)nh/h;
AffineTransform transform=new AffineTransform();
transform.setToScale(sx, sy);
AffineTransformOp ato=new AffineTransformOp(transform,null);
int type=src.getColorModel().getColorSpace().getType();
if(type==5){
//type=BufferedImage.TYPE_3BYTE_BGR;
type=BufferedImage.TYPE_INT_RGB;
}else if(type==6){
type=BufferedImage.TYPE_BYTE_GRAY;
}
BufferedImage tag=new BufferedImage(nw, nh,type);
ato.filter(src, tag);
if(isGray&&type!=6){
//生成灰色圖片
tag=getGrayImage(tag);
}
ImageIO.write(tag, "jpeg", imageFile);
tag.flush();
src.flush();
is.close();
把圖片轉成灰度圖
private BufferedImage getGrayImage(BufferedImage image){
BufferedImage dstimage=new BufferedImage(image.getWidth(),image.getHeight(),image.getType());
Graphics2D g2=dstimage.createGraphics();
RenderingHints hints=g2.getRenderingHints();
g2.dispose();
g2=null;
ColorSpace grayCS=ColorSpace.getInstance(ColorSpace.CS_GRAY);
ColorConvertOp colorConvertOp=new ColorConvertOp(grayCS,hints);
colorConvertOp.filter(image, dstimage);
return dstimage;
}
BufferedImage dstimage=new BufferedImage(image.getWidth(),image.getHeight(),image.getType());
Graphics2D g2=dstimage.createGraphics();
RenderingHints hints=g2.getRenderingHints();
g2.dispose();
g2=null;
ColorSpace grayCS=ColorSpace.getInstance(ColorSpace.CS_GRAY);
ColorConvertOp colorConvertOp=new ColorConvertOp(grayCS,hints);
colorConvertOp.filter(image, dstimage);
return dstimage;
}