java图片缩放不失真(收集)

  1. import java.awt.image.BufferedImage;   
  2. import java.io.ByteArrayInputStream;   
  3. import java.io.File;   
  4. import java.io.FileInputStream;   
  5. import java.io.IOException;   
  6. import java.io.InputStream;   
  7. import javax.imageio.ImageIO;   
  8. import com.mortennobel.imagescaling.ResampleOp;   
  9. import org.apache.log4j.Logger;   
  10.   
  11. /**  
  12.  * 图片缩放工具类  
  13.  * @author sunnymoon  
  14.  */  
  15. public class MyImage {   
  16.     private final Logger log = Logger.getLogger(this.getClass());   
  17.     /**  
  18.      * 接收输入流输生成图片  
  19.      * @param input  
  20.      * @param writePath  
  21.      * @param width  
  22.      * @param height  
  23.      * @param format  
  24.      * @return  
  25.      */  
  26.     public boolean resizeImage(InputStream input, String writePath,   
  27.             Integer width, Integer height, String format) {   
  28.         try {   
  29.             BufferedImage inputBufImage = ImageIO.read(input);   
  30.             log.info("转前图片高度和宽度:" + inputBufImage.getHeight() + ":"+ inputBufImage.getWidth());   
  31.             ResampleOp resampleOp = new ResampleOp(width, height);// 转换   
  32.             BufferedImage rescaledTomato = resampleOp.filter(inputBufImage,   
  33.                     null);   
  34.             ImageIO.write(rescaledTomato, format, new File(writePath));   
  35.             log.info("转后图片高度和宽度:" + rescaledTomato.getHeight() + ":"+ rescaledTomato.getWidth());   
  36.             return true;   
  37.         } catch (IOException e) {   
  38.             e.printStackTrace();   
  39.             return false;   
  40.         }   
  41.   
  42.     }   
  43.   
  44.     /**  
  45.      * 接收File输出图片  
  46.      * @param file  
  47.      * @param writePath  
  48.      * @param width  
  49.      * @param height  
  50.      * @param format  
  51.      * @return  
  52.      */  
  53.     public boolean resizeImage(File file, String writePath, Integer width,   
  54.             Integer height, String format) {   
  55.         try {   
  56.             BufferedImage inputBufImage = ImageIO.read(file);   
  57.             inputBufImage.getType();   
  58.             log.info("转前图片高度和宽度:" + inputBufImage.getHeight() + ":"+ inputBufImage.getWidth());   
  59.             ResampleOp resampleOp = new ResampleOp(width, height);// 转换   
  60.             BufferedImage rescaledTomato = resampleOp.filter(inputBufImage,   
  61.                     null);   
  62.             ImageIO.write(rescaledTomato, format, new File(writePath));   
  63.             log.info("转后图片高度和宽度:" + rescaledTomato.getHeight() + ":"+ rescaledTomato.getWidth());   
  64.             return true;   
  65.         } catch (IOException e) {   
  66.             e.printStackTrace();   
  67.             return false;   
  68.         }   
  69.   
  70.     }   
  71.   
  72.     /**  
  73.      * 接收字节数组生成图片  
  74.      * @param RGBS  
  75.      * @param writePath  
  76.      * @param width  
  77.      * @param height  
  78.      * @param format  
  79.      * @return  
  80.      */  
  81.     public boolean resizeImage(byte[] RGBS, String writePath, Integer width,   
  82.             Integer height, String format) {   
  83.         InputStream input = new ByteArrayInputStream(RGBS);   
  84.         return this.resizeImage(input, writePath, width, height, format);   
  85.     }   
  86.   
  87.     public byte[] readBytesFromIS(InputStream is) throws IOException {   
  88.         int total = is.available();   
  89.         byte[] bs = new byte[total];   
  90.         is.read(bs);   
  91.         return bs;   
  92.     }   
  93.        
  94.     //测试:只测试了字节流的方式,其它的相对简单,没有一一测试   
  95.     public static void main(String[] args) throws IOException {   
  96.            
  97.            
  98.         int width = 150;   
  99.         int height = 150;   
  100.         File inputFile = new File("F://from.jpg");   
  101.         File outFile = new File("F://to.jpg");   
  102.         String outPath = outFile.getAbsolutePath();   
  103.         MyImage myImage = new MyImage();   
  104.         InputStream input = new FileInputStream(inputFile);   
  105.         byte[] byteArrayImage=myImage.readBytesFromIS(input);   
  106.         input.read(byteArrayImage);   
  107.         myImage.resizeImage(byteArrayImage, outPath, width, height, "jpg");   
  108.     }   
  109. }  
在JFrame中,如果你需要对图片进行缩放失真,可以使用Java的ImageIO类和Java的Graphics2D类。以下是一个简单的示例: ```java // 读取原始图片 BufferedImage originalImage = ImageIO.read(new File("original.jpg")); // 计算缩放比例 double scale = 0.5; // 计算缩放后的尺寸 int scaledWidth = (int) (originalImage.getWidth() * scale); int scaledHeight = (int) (originalImage.getHeight() * scale); // 创建缩放后的图片 BufferedImage scaledImage = new BufferedImage(scaledWidth, scaledHeight, BufferedImage.TYPE_INT_RGB); // 绘制缩放后的图片 Graphics2D graphics2D = scaledImage.createGraphics(); graphics2D.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR); graphics2D.drawImage(originalImage, 0, 0, scaledWidth, scaledHeight, null); graphics2D.dispose(); // 显示缩放后的图片 JFrame frame = new JFrame("Scaled Image"); JLabel label = new JLabel(new ImageIcon(scaledImage)); frame.add(label); frame.pack(); frame.setVisible(true); ``` 在这个示例中,我们首先读取原始图片,然后计算缩放比例和缩放后的尺寸。接下来,我们创建一个缩放后的图片,并使用Graphics2D类中的drawImage方法绘制缩放后的图片。在绘制时,我们使用了插值算法来保证缩放后的图片质量。最后,我们将缩放后的图片添加到一个JFrame中,并显示出来。这样可以让你在JFrame中显示缩放后的图片,而失真
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

heguikun

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值