`

使用Java的ImageIO的图片处理实现

 
阅读更多
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");
分享到:
评论

相关推荐

    java处理图片背景颜色的方法

    title 中的“Java 处理图片背景颜色”是该方法的核心,表明该方法的主要功能是使用 Java 语言来处理图片的背景颜色。 在描述中,作者提到该方法可以将蓝底寸照批量转换为白底,具有很高的参考价值。这意味着该方法...

    采用java实现图片水印

    本篇文章将详细探讨如何使用Java实现图片水印的添加,以及相关的知识点。 首先,我们需要了解Java中的图像处理库。Java标准库提供了`java.awt`和`javax.imageio`包,它们包含了处理图像的基本功能。`java.awt`包中...

    java 图片压缩 iphone拍照上传旋转问题处理压缩工具类

    在Java开发中,处理图像尤其是来自...以上就是使用Java处理iPhone拍照上传时的图片旋转和压缩问题的方法。在实际应用中,可能还需要考虑其他因素,如图片尺寸调整、色彩管理等,但这个工具类已经能解决大部分基本需求。

    详解Java中使用ImageIO类对图片进行压缩的方法

    在Java中,对图片进行压缩和处理是一项常见的任务,特别是在开发涉及到图像上传、展示或者存储的应用程序时。`ImageIO` 类是Java标准库中用于读取、写入和处理图像的重要工具,它提供了灵活且高效的图像处理功能。...

    java图片压缩处理(可以压缩为任意大小

    除了Java 2D API,还有一些第三方库,如Apache Commons Imaging(以前的Sanselan)和ImageMagick,它们提供了更丰富的图片处理功能,包括高级压缩算法和更多格式支持。 总结来说,Java中的图片压缩涉及到读取图片、...

    java处理上传后的图片

    3. **资源回收**:在完成图片处理后,及时释放资源是非常重要的,以避免内存泄漏等问题。 #### 六、总结 本文详细介绍了如何使用Java对上传的图片进行处理,特别是缩放功能。通过对给定代码的分析,我们可以看到...

    java 图片转webp格式代码,maven项目

    你可以使用`javax.imageio.ImageIO`类的`read()`方法来读取JPG、PNG或其他格式的图片文件。 3. 创建WebP编码器实例。利用`webp-imageio-core-0.1.0`提供的类,创建一个可以将图像数据转换为WebP格式的对象。 4. ...

    java实现jpeg图片序列转avi格式

    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识别图片文字相关jar包 jai_imageio-1.1.1+swingx-1.6.1+ocr-1.11"提供了Java环境下实现OCR功能的基本工具,包括图像处理、用户界面构建和文本识别。开发者可以利用这些库开发出功能完善的OCR应用...

    使用java实现图片水印

    Java作为一种广泛应用的编程语言,可以轻松实现对图片进行处理的功能,包括但不限于添加水印。 #### 二、技术选型与原理分析 本文主要介绍了两种水印添加方法:一种是图片水印;另一种是文字水印。两种方式都使用了...

    java互转jpg和raw格式图片

    总结来说,Java借助JAI-ImageIO库能够有效地实现JPEG与RAW图像格式的相互转换,满足了开发者在图像处理中的多样化需求。然而,需要注意的是,转换过程可能会涉及复杂的图像处理知识和技术,因此在实际操作时需要对...

    java读取raw格式的图片并显示

    在Java编程环境中,处理RAW格式的图片文件可能会比常见的JPEG或PNG格式复杂,因为RAW文件...总的来说,处理RAW图像需要对图像处理原理和Java图形库有深入的理解,但通过使用合适的工具和策略,可以有效地实现这一目标。

    图片缩放、压缩技术java实现

    总之,Java提供了一系列强大的工具和库,使得图片处理和压缩变得简单易行。通过理解等比缩放和图片压缩的概念,以及如何在Java中实现它们,你可以有效地管理图像资源,提升应用的效率和用户体验。在实际操作中,你还...

    java处理图片大小等比例缩放,自定义修改图片大小,截取,水印

    在压缩包中的"java图片大小转换"文件中,很可能包含了实现这些功能的示例代码和使用说明,可以参考学习以加深理解。在实际开发中,我们还可以借助第三方库如`ImageMagick`、`Java Advanced Imaging (JAI)`或`JavaFX`...

    java图片处理工具类

    在Java编程语言中,处理图片是一项常见的任务,尤其在网页...开发者可以根据具体需求,灵活运用这些工具实现各种复杂的图片处理任务。通过深入理解这些技术,我们可以创建出强大的图片处理工具类,满足日常开发需求。

    java图片高级处理(渐变,锐化,边缘检测)

    Java标准库中的`java.awt`和`javax.imageio`包提供了基本的图像处理工具。然而,对于更复杂的任务,开发者可能会利用第三方库,如OpenCV(一个跨平台的计算机视觉库),它可以提供更多的图像处理函数和算法。 为了...

    java实现图像处理算法

    示例代码展示了如何使用Java的图像处理库来对图像进行灰度化处理。在代码中,我们使用javax.imageio.ImageIO类加载输入图像文件,并创建一个与输入图像具有相同尺寸和类型的输出图像。然后,我们遍历输入图像的每个...

    Java将图片合并为视频

    1. **图片读取**:使用Java的`BufferedImage`类读取图片文件,或者使用第三方库如`ImageIO`进行更高效的操作。 2. **帧序列创建**:将每张图片转换为FFmpeg可识别的帧格式,通常为JPEG或PNG。 3. **视频参数设置**:...

    java中处理图片水印

    在Java编程语言中,处理图片水印涉及到图像处理和图形绘制技术。`Graphics2D`是Java 2D API的一部分,它提供了丰富的功能,可以用来在图像上添加文本、图像等元素,实现水印效果。下面我们将深入探讨如何使用`...

    java图片缩放处理

    在Java编程语言中,处理图片是一...综上所述,Java提供了丰富的API和第三方库用于图片处理,包括缩放、比例调整和压缩等操作。在实际开发中,我们需要根据具体需求选择合适的方法和技术,以达到最佳的处理效果和性能。

Global site tag (gtag.js) - Google Analytics