通过BufferedImage实现将几张图片合成一张图片,图片效果类型为依次排列图片


          这周末老师要求做一个藏宝图效果的图片io测试,所要求的效果是首先给你四张已经由ps处理过的图片,这几种图片为该藏宝图所截取的四张图。

          以下为所提供的四张图片:

          1.jpg

          

         2.jpg

         

         3.jpg

        

        4.jpg

       

       最终希望合成的效果:

     

附上代码:

package com.hcj.july19.am;
//导入需要的包
import java.io.*;
import java.io.File;
import java.io.FileOutputStream;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.image.BufferedImage;

/*
 * 当导入一下这两个包时,MyEclipse会报错:
 * Access restriction: The type JPEGImageEncoder is not accessible due to 
restriction on required library C:\Java\jre1.6.0_07\lib\rt.jar
 * 解决方法
 * Eclipse默认把这些受访问限制的API设成了ERROR。
 * 只要把Windows-Preferences-Java-Complicer-Errors/Warnings里面的
 * Deprecated and restricted API中的Forbidden references(access rules)选为Warning就可以编译通过。
 */
import com.sun.image.codec.jpeg.JPEGCodec;
import com.sun.image.codec.jpeg.JPEGImageEncoder;

public class ImageTest {

	public ImageTest() {}

	public static void main(String[] args) {
		try {
			ImageTest test = new ImageTest();
			test.ImageTset();
		} catch (Exception e) {
			System.out.print(e);
		}
	}

	public void ImageTset() throws Exception {
		//创建四个文件对象(注:这里四张图片的宽度都是相同的,因此下文定义BufferedImage宽度就取第一只的宽度就行了)
		File _file1 = new File("1.jpg");
		File _file2 = new File("2.jpg");
		File _file3 = new File("3.jpg");
		File _file4 = new File("4.jpg");

		Image src1 = javax.imageio.ImageIO.read(_file1);
		Image src2 = javax.imageio.ImageIO.read(_file2);
		Image src3 = javax.imageio.ImageIO.read(_file3);
		Image src4 = javax.imageio.ImageIO.read(_file4);
		
		//获取图片的宽度
		int width = src1.getWidth(null);
		//获取各个图像的高度
		int height1 = src1.getHeight(null);
		int height2 = src2.getHeight(null);
		int height3 = src3.getHeight(null);
		int height4 = src4.getHeight(null);
		
		//构造一个类型为预定义图像类型之一的 BufferedImage。 宽度为第一只的宽度,高度为各个图片高度之和
		BufferedImage tag = new BufferedImage(width, height1 + height2 + height3 + height4, BufferedImage.TYPE_INT_RGB);
		//创建输出流
		FileOutputStream out = new FileOutputStream("treasureMap.jpg");
		//绘制合成图像
		Graphics g = tag.createGraphics();
		g.drawImage(src1, 0, 0, width, height1, null);
		g.drawImage(src2, 0, height1, width , height2, null);
		g.drawImage(src3, 0, height1 + height2, width, height3, null);
		g.drawImage(src4, 0, height1 + height2 + height3, width, height4, null);
		// 释放此图形的上下文以及它使用的所有系统资源。
		g.dispose();
		//将绘制的图像生成至输出流
		JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
		encoder.encode(tag);
		//关闭输出流
		out.close();
		System.out.println("藏宝图出来了");
	}
}

测试通过,各个图片连接正常,无断层现象

  

备注:上述里有说到导入JPEGCodec和JPEGImageEncoder时 在eclipse里会报错(这里特别说明下,这个只是eclipse的提示,不影响程序的运行)

这边看了下评论里有同学说到这个问题,我这边演示下。

1.设置之前,代码飘红。

2.鼠标挪到飘红部分,会出现提示窗口,点击下面的链接处

3.出现以下界面,点击apply,然后点击ok


4.设置完成

  • 10
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
要将多张图片合成一张,可以使用Java中的BufferedImage类。以下是实现该功能的基本步骤: 1. 创建一个新的BufferedImage对象,指定它的宽度和高度。 2. 获取Graphics2D对象,并使用它来将多张图片绘制到新的BufferedImage上。可以使用Graphics2D的drawImage方法来绘制图片。 3. 将合成BufferedImage保存到磁盘或将其显示在界面上。 以下是一个简单的Java代码示例,演示如何将两张图片合成一张: ```java import java.awt.*; import java.awt.image.BufferedImage; import java.io.File; import javax.imageio.ImageIO; public class MergeImages { public static void main(String[] args) throws Exception { BufferedImage img1 = ImageIO.read(new File("image1.jpg")); BufferedImage img2 = ImageIO.read(new File("image2.jpg")); int width = img1.getWidth() + img2.getWidth(); int height = Math.max(img1.getHeight(), img2.getHeight()); BufferedImage combined = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB); Graphics2D g = combined.createGraphics(); g.drawImage(img1, 0, 0, null); g.drawImage(img2, img1.getWidth(), 0, null); g.dispose(); ImageIO.write(combined, "PNG", new File("merged.png")); } } ``` 在这个例子中,我们使用了ImageIO类来读取两张图片,然后计算出新的合成图片的宽度和高度。接下来,我们创建了一个新的BufferedImage对象,指定它的宽度和高度。然后,我们获取Graphics2D对象,并使用它来将两张图片绘制到新的BufferedImage上。最后,我们将合成BufferedImage保存到磁盘上。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值