首页 > 编程语言 >一段四合一图片整和Java代码

一段四合一图片整和Java代码

时间:2023-03-21 16:47:55浏览次数:40  
标签:Java int getHeight BufferedImage getWidth 整和 image3 image1 四合

实现内容

能够实现将四张图片拼接,整合成一张完整图片

 使用了getRGB、setRGB方法进行图片的提取拼接

实现代码

image1 = ImageIO.read(imageFile1);
image2 = ImageIO.read(imageFile2);
image3 = ImageIO.read(imageFile3);
image4 = ImageIO.read(imageFile4);
int width12 = image1.getWidth() + image2.getWidth();
int width34 = image3.getWidth() + image4.getWidth();
int width = Math.max(width12, width34);
int height = image1.getHeight() + image3.getHeight();
mergedImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
int[] rgbArray1 = image1.getRGB(0, 0, image1.getWidth(), image1.getHeight(), null, 0, image1.getWidth());
int[] rgbArray2 = image2.getRGB(0, 0, image2.getWidth(), image2.getHeight(), null, 0, image2.getWidth());
int[] rgbArray3 = image3.getRGB(0, 0, image3.getWidth(), image3.getHeight(), null, 0, image3.getWidth());
int[] rgbArray4 = image4.getRGB(0, 0, image4.getWidth(), image4.getHeight(), null, 0, image4.getWidth());
// 创建四个线程,分别处理每张图片的RGB数组,使用四个线程,是考虑到可能图片操作速度慢,但是实际效果提升不是很大,可不用
ExecutorService executor = Executors.newFixedThreadPool(4);
BufferedImage finalMergedImage = mergedImage;
BufferedImage finalImage1 = image1;
BufferedImage finalImage2 = image2;
BufferedImage finalImage3 = image3;
BufferedImage finalImage4 = image4;

Future<Void> future1 = executor.submit(() -> {
    writeRGBArrayToMergedImage(rgbArray1, finalMergedImage, 0, 0, finalImage1.getWidth(), finalImage1.getHeight());
    return null;
});
Future<Void> future2 = executor.submit(() -> {
    writeRGBArrayToMergedImage(rgbArray2, finalMergedImage, finalImage1.getWidth(), 0, finalImage2.getWidth(), finalImage2.getHeight());
    return null;
});
Future<Void> future3 = executor.submit(() -> {
    writeRGBArrayToMergedImage(rgbArray3, finalMergedImage, 0, finalImage1.getHeight(), finalImage3.getWidth(), finalImage3.getHeight());
    return null;
});
Future<Void> future4 = executor.submit(() -> {
    writeRGBArrayToMergedImage(rgbArray4, finalMergedImage, finalImage3.getWidth(), finalImage1.getHeight(), finalImage4.getWidth(), finalImage4.getHeight());
    return null;
});
// 等待四个线程执行完毕
future1.get();
future2.get();
future3.get();
future4.get();
// 关闭线程池
executor.shutdown();

//------------------------------------------------------------------------
private static void writeRGBArrayToMergedImage(int[] rgbArray, BufferedImage mergedImage, int x, int y, int w, int h) {
mergedImage.setRGB(x, y, w, h, rgbArray, 0, w);
}

补充

Q多线程操作finalMergedImage ,为什么最终获得的是整合后的值而没有被覆盖且没有冲突   A:这是因为在Java中,对象引用是传递的,而不是对象本身。在这段代码中,每个线程都是使用final修饰的变量引用了finalMergedImage,而finalMergedImage指向的是同一个BufferedImage对象。因此,每个线程都在对同一个对象进行操作,但是由于这些操作并不会修改这个对象的引用,因此不会出现竞争条件和冲突。最终获得的是整合后的值,因为每个线程都在对这个对象进行修改,最终将它们整合起来就得到了最终的结果。

标签:Java,int,getHeight,BufferedImage,getWidth,整和,image3,image1,四合
From: https://www.cnblogs.com/lixv2018/p/17240480.html

相关文章

  • java.io.FileNotFoundException: cacerts (拒绝访问)
    文件找不到?不可能的,上面能读取到证书内容怎么可能是文件找不到。真正的原因是因为权限不足,所以拒绝访问。为什么会权限不足?因为我的JDK是以默认路径安装到C盘中的,对其进行操......
  • JSON parse error: Cannot deserialize value of type `java.util.Date` from String
    日志Resolved[org.springframework.http.converter.HttpMessageNotReadableException:JSONparseerror:Cannotdeserializevalueoftype`java.util.Date`fromStr......
  • Java 锁
    Java中的锁是一种同步机制,用于控制对共享资源的访问。锁提供了对共享资源的独占访问,以确保在给定时间内只有一个线程可以访问该资源。Java中有两种类型的锁:内置锁和显式锁......
  • 使用 ChatGPT 模型实现 JavaScript 加密解密技术
    以下是一个使用ChatGPT模型实现混淆加密解密的案例代码。该代码使用JavaScript编写,并且使用了TensorFlow.js库来加载和执行ChatGPT模型。代码的目的是将输入的文本......
  • java实现多字段排序(普通对象List和MapList)
    publicclassSortTest{publicstaticvoidmain(String[]args){//普通对象listsortVOList();//mapListsortMapList();......
  • 如何通过Java应用程序将PDF转为图片格式?
    PDF文件和图片文件,这是两种完全不一样的格式,可是有的时候这两种格式却是有相互转换的需要,大家在工作中遇到PDF文件转图片文件的问题时是怎么解决的呢?你们使用的方法简单方便......
  • JAVA代码审计 SSRF篇
    一、巩固SSRFSSRF服务端请求伪造,Web应用程序往往会提供一些能够从远处获取图片或是文件的接口,在这些接口上用户使用指定的URL便能完成远程获取图片,下载文件等操作。......
  • 6.Java HotSpot(TM) 64-Bit Server VM warning: INFO: os::commit_memory(0x000000079
    这个问题引起的原因是:服务器上物理内存太小,大部分都是应为程序太多,内存吃紧,而给jvm分配的内存太大(java程序启动需要的内存,linux不能给),最好调整java程序jvm内存吧(测试环......
  • Java 中 Future 的 get 方法超时会怎样?
    一、背景很多Java工程师在准备面试时,会刷很多八股文,线程和线程池这一块通常会准备线程的状态、线程的创建方式,Executors里面的一些工厂方法和为什么不推荐使用这些工厂方......
  • Java 接口的所有子类都需要执行相同处理逻辑的推荐姿势
    一、背景在实际开发过程中,有些时候我们可能会遇到这样的场景:我们定义接口给上游使用,不同的业务类型定义不同的子类型,实现该接口的某个函数,但是这些子类型会有很多公共的逻辑......