import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.RenderingHints;
import java.awt.image.BufferedImage;
import java.awt.image.ColorModel;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import javax.imageio.IIOImage;
import javax.imageio.ImageIO;
import javax.imageio.ImageWriteParam;
import javax.imageio.ImageWriter;
import javax.imageio.stream.ImageOutputStream;
import com.ysccc.api.parent.constant.ProjectException;
import com.ysccc.api.parent.vo.Messages;
public class ImageCompress {
private static BufferedImage loadImage(InputStream in) throws IOException {
return ImageIO.read(in);
}
private static BufferedImage loadImage(String filePath) throws IOException {
FileInputStream is = null;
BufferedImage image = null;
try {
File file = new File(filePath);
if (file.exists() && file.isFile() && file.canRead()) {
is = new FileInputStream(file);
image = loadImage(is);
} else {
throw new ProjectException(Messages.IMAGE_FILE_READ_FAIL);
}
} catch (Exception e) {
throw e;
} finally {
if (is != null) {
is.close();
}
}
return image;
}
private static BufferedImage resizeImage(BufferedImage oldImage, int width, int height) throws IOException {
int oldWidth = oldImage.getWidth();
int oldHeight = oldImage.getHeight();
ColorModel colorModel = oldImage.getColorModel();
BufferedImage newImage = new BufferedImage(colorModel, colorModel.createCompatibleWritableRaster(width, height),
colorModel.isAlphaPremultiplied(), null);
// 说是能扫描的更清楚的写法,咱没感觉出来
Image img = oldImage.getScaledInstance(oldWidth, oldHeight, Image.SCALE_SMOOTH);
Graphics2D graphics = newImage.createGraphics();
// 说是能抗锯齿,能平滑,能……,实际完全没感觉,是不是写的有问题呢
graphics.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
graphics.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
graphics.drawImage(img, 0, 0, width, height, null);
return newImage;
}
private static ImageWriteParam configCompressParam(ImageWriter writer, float quality) {
ImageWriteParam param = writer.getDefaultWriteParam();
param.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
param.setCompressionQuality(quality);
return param;
}
private static void writeImage(ImageWriter writer, String filePath, BufferedImage image, float quality) throws IOException {
OutputStream os = null;
ImageOutputStream ios = null;
try {
os = new FileOutputStream(new File(filePath));
ios = ImageIO.createImageOutputStream(os);
writer.setOutput(ios);
writer.write(null, new IIOImage(image, null, null), configCompressParam(writer, quality));
} catch (Exception e) {
throw e;
} finally {
if (os != null) {
os.close();
}
if (ios != null) {
ios.close();
}
if (writer != null) {
writer.dispose();
}
}
}
private static ImageWriter getWriter(String imageSuffix) {
return ImageIO.getImageWritersByFormatName(imageSuffix).next();
}
public static void main(String[] args) throws IOException {
BufferedImage oImage = loadImage("C:\\Users\\Administrator\\Desktop\\bigImage\\_G7A2008.JPG");
BufferedImage nImage = resizeImage(oImage, (int) (oImage.getWidth() / 2), (int) (oImage.getHeight() / 2));
ImageWriter writer = getWriter("jpg");
writeImage(writer, "C:\\Users\\Administrator\\Desktop\\bigImage\\compress1.jpg", nImage, 0.5f);
}
}
写了这么多,如果按比例缩小图片的话,会发现一点都不清楚,按质量倒是没什么问题。
于是就放弃这种写法了,改用了Google的Thumbnails,发现简直差距太大了,唉……原生的代码果然不行啊
Thumbnails.of(new File("C:\\Users\\Administrator\\Desktop\\bigImage\\7.jpg")).scale(1f).outputFormat("jpg")
.outputQuality(0.5)
.toFile("C:\\Users\\Administrator\\Desktop\\bigImage\\compress2.jpg");
分享到:
相关推荐
title 中的“Java 处理图片背景颜色”是该方法的核心,表明该方法的主要功能是使用 Java 语言来处理图片的背景颜色。 在描述中,作者提到该方法可以将蓝底寸照批量转换为白底,具有很高的参考价值。这意味着该方法...
本篇文章将详细探讨如何使用Java实现图片水印的添加,以及相关的知识点。 首先,我们需要了解Java中的图像处理库。Java标准库提供了`java.awt`和`javax.imageio`包,它们包含了处理图像的基本功能。`java.awt`包中...
在Java开发中,处理图像尤其是来自...以上就是使用Java处理iPhone拍照上传时的图片旋转和压缩问题的方法。在实际应用中,可能还需要考虑其他因素,如图片尺寸调整、色彩管理等,但这个工具类已经能解决大部分基本需求。
在Java中,对图片进行压缩和处理是一项常见的任务,特别是在开发涉及到图像上传、展示或者存储的应用程序时。`ImageIO` 类是Java标准库中用于读取、写入和处理图像的重要工具,它提供了灵活且高效的图像处理功能。...
除了Java 2D API,还有一些第三方库,如Apache Commons Imaging(以前的Sanselan)和ImageMagick,它们提供了更丰富的图片处理功能,包括高级压缩算法和更多格式支持。 总结来说,Java中的图片压缩涉及到读取图片、...
3. **资源回收**:在完成图片处理后,及时释放资源是非常重要的,以避免内存泄漏等问题。 #### 六、总结 本文详细介绍了如何使用Java对上传的图片进行处理,特别是缩放功能。通过对给定代码的分析,我们可以看到...
你可以使用`javax.imageio.ImageIO`类的`read()`方法来读取JPG、PNG或其他格式的图片文件。 3. 创建WebP编码器实例。利用`webp-imageio-core-0.1.0`提供的类,创建一个可以将图像数据转换为WebP格式的对象。 4. ...
2. **读取JPEG图片**:使用Java的`javax.imageio`包来读取JPEG图片,将其转化为BufferedImage对象。 ```java import javax.imageio.ImageIO; BufferedImage image = ImageIO.read(new File("path/to/jpeg/image.jpg...
总结来说,"Java识别图片文字相关jar包 jai_imageio-1.1.1+swingx-1.6.1+ocr-1.11"提供了Java环境下实现OCR功能的基本工具,包括图像处理、用户界面构建和文本识别。开发者可以利用这些库开发出功能完善的OCR应用...
总结来说,Java借助JAI-ImageIO库能够有效地实现JPEG与RAW图像格式的相互转换,满足了开发者在图像处理中的多样化需求。然而,需要注意的是,转换过程可能会涉及复杂的图像处理知识和技术,因此在实际操作时需要对...
Java作为一种广泛应用的编程语言,可以轻松实现对图片进行处理的功能,包括但不限于添加水印。 #### 二、技术选型与原理分析 本文主要介绍了两种水印添加方法:一种是图片水印;另一种是文字水印。两种方式都使用了...
总之,Java提供了一系列强大的工具和库,使得图片处理和压缩变得简单易行。通过理解等比缩放和图片压缩的概念,以及如何在Java中实现它们,你可以有效地管理图像资源,提升应用的效率和用户体验。在实际操作中,你还...
在压缩包中的"java图片大小转换"文件中,很可能包含了实现这些功能的示例代码和使用说明,可以参考学习以加深理解。在实际开发中,我们还可以借助第三方库如`ImageMagick`、`Java Advanced Imaging (JAI)`或`JavaFX`...
在Java编程语言中,处理图片是一项常见的任务,尤其在网页...开发者可以根据具体需求,灵活运用这些工具实现各种复杂的图片处理任务。通过深入理解这些技术,我们可以创建出强大的图片处理工具类,满足日常开发需求。
示例代码展示了如何使用Java的图像处理库来对图像进行灰度化处理。在代码中,我们使用javax.imageio.ImageIO类加载输入图像文件,并创建一个与输入图像具有相同尺寸和类型的输出图像。然后,我们遍历输入图像的每个...
Java标准库中的`java.awt`和`javax.imageio`包提供了基本的图像处理工具。然而,对于更复杂的任务,开发者可能会利用第三方库,如OpenCV(一个跨平台的计算机视觉库),它可以提供更多的图像处理函数和算法。 为了...
在Java编程环境中,处理RAW格式的图片文件可能会比常见的JPEG或PNG格式复杂,因为RAW文件...总的来说,处理RAW图像需要对图像处理原理和Java图形库有深入的理解,但通过使用合适的工具和策略,可以有效地实现这一目标。
在Java编程语言中,处理图片是一...综上所述,Java提供了丰富的API和第三方库用于图片处理,包括缩放、比例调整和压缩等操作。在实际开发中,我们需要根据具体需求选择合适的方法和技术,以达到最佳的处理效果和性能。
在Java编程语言中,处理图片水印涉及到图像处理和图形绘制技术。`Graphics2D`是Java 2D API的一部分,它提供了丰富的功能,可以用来在图像上添加文本、图像等元素,实现水印效果。下面我们将深入探讨如何使用`...
Java中没有直接提供图片压缩的功能,但我们可以使用第三方库如`ImageMagick`或`Apache Commons Imaging`(以前称为`Apache Sanselan`)来实现。其中,`ImageMagick`通常通过命令行接口操作,而`Apache Commons ...