Java:检测图像格式、调整大小(缩放)并另存为JPEG

Java:检测图像格式、调整大小(缩放)并另存为JPEG,java,image,resize,javax.imageio,graphics2d,Java,Image,Resize,Javax.imageio,Graphics2d,这是我的代码,它实际上工作,并不完美,但确实如此,问题是大小调整后的缩略图没有粘贴在白色绘制的矩形上,破坏了图像的纵横比,这是代码,有人能建议我修复它吗 多谢各位 import java.awt.Color; import java.awt.Graphics2D; import java.awt.Image; import java.awt.RenderingHints; import java.awt.geom.Rectangle2D; import java.awt.image.Buffer

这是我的代码,它实际上工作,并不完美,但确实如此,问题是大小调整后的缩略图没有粘贴在白色绘制的矩形上,破坏了图像的纵横比,这是代码,有人能建议我修复它吗

多谢各位

import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.RenderingHints;
import java.awt.geom.Rectangle2D;
import java.awt.image.BufferedImage;
import java.io.BufferedInputStream;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;

import javax.imageio.ImageIO;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

public class ImageScalerImageIoImpl implements ImageScaler {

 private static final String OUTPUT_FORMAT_ID = "jpeg";

 // Re-scaling image
 public byte[] scaleImage(byte[] originalImage, int targetWidth,
   int targetHeight) {

  try {
   InputStream imageStream = new BufferedInputStream(
     new ByteArrayInputStream(originalImage));
   Image image = (Image) ImageIO.read(imageStream);

   int thumbWidth = targetWidth;
   int thumbHeight = targetHeight;

   // Make sure the aspect ratio is maintained, so the image is not skewed
         double thumbRatio = (double)thumbWidth / (double)thumbHeight;
         int imageWidth = image.getWidth(null);
         int imageHeight = image.getHeight(null);
         double imageRatio = (double)imageWidth / (double)imageHeight;
         if (thumbRatio < imageRatio) {
           thumbHeight = (int)(thumbWidth / imageRatio);
         } else {
           thumbWidth = (int)(thumbHeight * imageRatio);
         }

   // Draw the scaled image
   BufferedImage thumbImage = new BufferedImage(thumbWidth,
     thumbHeight, BufferedImage.TYPE_INT_RGB);
   System.out.println("Thumb width Buffered: " + thumbWidth + " || Thumb height Buffered: " + thumbHeight);

   Graphics2D graphics2D = thumbImage.createGraphics();
   // Use of BILNEAR filtering to enable smooth scaling
   graphics2D.setRenderingHint(RenderingHints.KEY_INTERPOLATION,
     RenderingHints.VALUE_INTERPOLATION_BILINEAR);
   // graphics2D.drawImage(image, 0, 0, thumbWidth, thumbHeight, null);

   // White Background
   graphics2D.setPaint(Color.WHITE);
   graphics2D.fill(new Rectangle2D.Double(0, 0, targetWidth,
     targetHeight));
   graphics2D.fillRect(0, 0, targetWidth, targetHeight);

   System.out.println("Target width: " + targetWidth + " || Target height: " + targetHeight);

   // insert the resized thumbnail between X and Y of the image 
   graphics2D.drawImage(image, 0, 0, thumbWidth, thumbHeight, null);

   System.out.println("Thumb width: " + thumbWidth + " || Thumb height: " + thumbHeight);

   // Write the scaled image to the outputstream
   ByteArrayOutputStream out = new ByteArrayOutputStream();
   ImageIO.write(thumbImage, OUTPUT_FORMAT_ID, out);
   return out.toByteArray();

  } catch (IOException ioe) {
   throw new ImageResizingException(ioe);
  }
 }

}
导入java.awt.Color;
导入java.awt.Graphics2D;
导入java.awt.Image;
导入java.awt.RenderingHints;
导入java.awt.geom.Rectangle2D;
导入java.awt.image.buffereImage;
导入java.io.BufferedInputStream;
导入java.io.ByteArrayInputStream;
导入java.io.ByteArrayOutputStream;
导入java.io.IOException;
导入java.io.InputStream;
导入javax.imageio.imageio;
导入org.apache.commons.logging.Log;
导入org.apache.commons.logging.LogFactory;
公共类ImageScalerImageIoImpl实现ImageScaler{
私有静态最终字符串输出\u格式\u ID=“jpeg”;
//重缩放图像
公共字节[]缩放图像(字节[]原始图像,int targetWidth,
int targetHeight){
试一试{
InputStream imageStream=新的BufferedInputStream(
新ByteArrayInputStream(原始图像));
图像图像=(图像)ImageIO.read(图像流);
int thumbWidth=targetWidth;
int thumbHeight=targetHeight;
//确保保持纵横比,以便图像不会倾斜
双拇指比率=(双)拇指宽度/(双)拇指高度;
int imageWidth=image.getWidth(null);
int imageHeight=image.getHeight(null);
双成像比=(双)成像宽度/(双)成像高度;
if(拇指比率<图像比率){
拇指高度=(int)(拇指宽度/图像比率);
}否则{
拇指宽度=(int)(拇指高度*图像比率);
}
//绘制缩放图像
BuffereImage thumbImage=新的BuffereImage(thumbWidth,
拇指高度,BuffereImage.TYPE_INT_RGB);
System.out.println(“缓冲拇指宽度:+thumbWidth+”| |缓冲拇指高度:+thumbHeight”);
Graphics2D Graphics2D=thumbImage.createGraphics();
//使用双线性过滤实现平滑缩放
graphics2D.setRenderingHint(RenderingHints.KEY_插值,
渲染提示。值(插值(双线性);
//graphics2D.drawImage(图像,0,0,指宽,指高,空);
//白色背景
图形2d.setPaint(颜色:白色);
图形2D.填充(新矩形2D.双(0,0,targetWidth,
瞄准目标(右);
graphics2D.fillRect(0,0,targetWidth,targetLight);
System.out.println(“目标宽度:+targetWidth+”| |;目标高度:+targetHeight”);
//在图像的X和Y之间插入调整大小的缩略图
graphics2D.drawImage(图像,0,0,指宽,指高,空);
System.out.println(“拇指宽度:+thumbWidth+”| |拇指高度:+thumbHeight”);
//将缩放图像写入输出流
ByteArrayOutputStream out=新建ByteArrayOutputStream();
ImageIO.write(拇指图像,输出格式ID,输出);
return out.toByteArray();
}捕获(ioe异常ioe){
抛出新的ImageResizingException(ioe);
}
}
}

您可以使用的方法轻松缩放图像:

一旦获得缩放后的
图像
,即可将其“转换”为所述的图像


最后,使用该类将
buffereImage
写入文件。

缩放需要根据目标画布容器进行动态调整。无论如何,我自己解决了这个问题,进行了一次很好的重构和一些逻辑修复。无论如何,谢谢链接不起作用。图像到缓冲区的转换提示?哪个链接不起作用?我刚刚尝试了所有这些功能,它们看起来还可以。仅供参考:重定向到已驻留的域站点。GetScaleInstance可能不是您最好的朋友:
BufferedImage img = ImageIO.read(new File("image.jpg"));
int scaleX = (int) (img.getWidth() * 0.5);
int scaleY = (int) (img.getHeight() * 0.5);

Image newImg = img.getScaledInstance(scaleX, scaleY, Image.SCALE_SMOOTH);