`

java多线程分隔图片程序

    博客分类:
  • java
阅读更多
package com.xyz.test;

import java.awt.Graphics;
import java.awt.Image;
import java.awt.Toolkit;
import java.awt.image.BufferedImage;
import java.awt.image.CropImageFilter;
import java.awt.image.FilteredImageSource;
import java.awt.image.ImageFilter;
import java.io.File;

import javax.imageio.ImageIO;

public class ImageCut {

	/**
	 * 图像切割 改用线程
	 * @param srcBi源图像
	 * @param desImgName 切片目标文件名
	 * @param desType 目标图片类型jpg、png
	 * @param desWidth 目标切片宽度
	 * @param desHeight 目标切片高度
	 */
	@SuppressWarnings("unused")
	private void cutImag(BufferedImage srcBi, String desImgName, String desType, int desWidth, int desHeight) {
		try {
			int srcWidth = srcBi.getWidth(); // 源图宽度
			int srcHeight = srcBi.getHeight(); // 源图高度
			if (srcWidth > desWidth && srcHeight > desHeight) {
				Image image = srcBi.getScaledInstance(srcWidth, srcHeight, Image.SCALE_SMOOTH);
				int cols = 0; // 切片横向数量
				int rows = 0; // 切片纵向数量
				int lastRW = srcWidth % desWidth;
				int lastRH = srcHeight % desHeight;
				// 计算切片的横向和纵向数量
				if (lastRW == 0) {
					cols = srcWidth / desWidth;
				} else {
					cols = (int) Math.floor(srcWidth / desWidth) + 1;
				}
				
				if (lastRH == 0) {
					rows = srcHeight / desHeight;
				} else {
					rows = (int) Math.floor(srcHeight / desHeight) + 1;
				}
				
				// 循环建立切片
				// 改进的想法:是否可用多线程加快切割速度
				BufferedImage tagBi = null;
				Graphics g = null;
				Image img;
				ImageFilter cropFilter; // 读取源图像
				for (int i = 0; i < rows; i++) {
					for (int j = 0; j < cols; j++) {
						// 四个参数分别为图像起点坐标和宽高
						cropFilter = new CropImageFilter(j * desWidth, i * desHeight, lastRW > 0 && cols - 1 == j ? lastRW : desWidth, lastRH > 0 && rows - 1 == i ? lastRH : desHeight);
						img = Toolkit.getDefaultToolkit().createImage(new FilteredImageSource(image.getSource(), cropFilter));
						tagBi = new BufferedImage(lastRW > 0 && cols - 1 == j ? lastRW : desWidth, lastRH > 0 && rows - 1 == i ? lastRH : desHeight, BufferedImage.TYPE_INT_RGB);
						g = tagBi.getGraphics();
						g.drawImage(img, 0, 0, null); // 绘制缩小后的图
						g.dispose();
						// 输出为文件
						ImageIO.write(tagBi, desType, new File(desImgName + "_" + BaseDir.formartNumber(j) + "_" + BaseDir.formartNumber(i) + "."+desType));
					}
				}
			}else{
				ImageIO.write(srcBi, desType, new File(desImgName + "_000_000."+desType));
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	/**
	 * 为nanojs框架切割图片
	 * @param srcImgFile 要切割的文件名称
	 * @param descImgName 目标文件名称
	 * @param tilesize 目标图片类型jpg、png
	 * @param tilesize 分隔大小 
	 */
	public void cutImagForPanojs(String srcImgFile, String descImgName, String descType, int tilesize){
		try {
			BufferedImage srcBi = ImageIO.read(new File(srcImgFile)); // 读入文件
			int level_width = srcBi.getWidth();    
			int level_height = srcBi.getHeight();   
			int i = 1;
			Image image = null;
			BufferedImage tagBi = null;
			Graphics g = null;
			//切割原始图片
			//this.cutImag(srcBi, descImgName + BaseDir.formartNumber(0), descType, tilesize, tilesize);
			//改用线程
			new CutImgThread(srcBi, descImgName + BaseDir.formartNumber(0), descType, tilesize, tilesize).start();
		    while (level_width > tilesize || level_height > tilesize) {      
		    	level_width  = (int) Math.floor(level_width / 2);
		        level_height = (int) Math.floor(level_height / 2);
		        image = srcBi.getScaledInstance(level_width, level_height, Image.SCALE_SMOOTH);
		        tagBi = new BufferedImage(level_width, level_height, BufferedImage.TYPE_INT_RGB);
				g = tagBi.getGraphics();
				g.drawImage(image, 0, 0, null); // 绘制缩小后的图
				g.dispose();
	        	//this.cutImag(tagBi, descImgName + BaseDir.formartNumber(i), descType, tilesize, tilesize);
	        	//改用线程
				new CutImgThread(tagBi, descImgName + BaseDir.formartNumber(i), descType, tilesize, tilesize).start();
		        i++;
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	public static void main(String[] args) {
		 long start = System.currentTimeMillis();
		 ImageCut ic = new ImageCut();
		 ic.cutImagForPanojs(BaseDir.BASE_DIR+"datamap/main_component.png", BaseDir.BASE_DIR+"datamap/pyramid1/main_", "jpg", 256);
		 System.out.println("耗时:"+(System.currentTimeMillis()-start)/1000+"s");
	}
}

/**
 * 由于需要不同缩放的切割,用多线程去切割
 * 
 * @dp_new
 * @author zhangxy
 * @Jun 27, 2013
 * @
 */
class CutImgThread extends Thread{
	private BufferedImage srcBi;
	private String desImgName;
	private String desType;
	private int desWidth;
	private int desHeight;
	
	public CutImgThread(BufferedImage srcBi, String desImgName, String desType,
			int desWidth, int desHeight) {
		this.srcBi = srcBi;
		this.desImgName = desImgName;
		this.desType = desType;
		this.desWidth = desWidth;
		this.desHeight = desHeight;
	}

	@Override
	public void run() {
		try {
			int srcWidth = srcBi.getWidth(); // 源图宽度
			int srcHeight = srcBi.getHeight(); // 源图高度
			if (srcWidth > desWidth && srcHeight > desHeight) {
				Image image = srcBi.getScaledInstance(srcWidth, srcHeight, Image.SCALE_SMOOTH);
				int cols = 0; // 切片横向数量
				int rows = 0; // 切片纵向数量
				int lastRW = srcWidth % desWidth;
				int lastRH = srcHeight % desHeight;
				// 计算切片的横向和纵向数量
				if (lastRW == 0) {
					cols = srcWidth / desWidth;
				} else {
					cols = (int) Math.floor(srcWidth / desWidth) + 1;
				}
				
				if (lastRH == 0) {
					rows = srcHeight / desHeight;
				} else {
					rows = (int) Math.floor(srcHeight / desHeight) + 1;
				}
				
				// 循环建立切片
				// 改进的想法:是否可用多线程加快切割速度
				BufferedImage tagBi = null;
				Graphics g = null;
				Image img;
				ImageFilter cropFilter; // 读取源图像
				for (int i = 0; i < rows; i++) {
					cropFilter = new CropImageFilter(0, i * desHeight, srcWidth, desHeight);
					img = Toolkit.getDefaultToolkit().createImage(new FilteredImageSource(image.getSource(), cropFilter));
					tagBi = new BufferedImage(srcWidth, desHeight, BufferedImage.TYPE_INT_RGB);
					g = tagBi.getGraphics();
					g.drawImage(img, 0, 0, null); // 绘制缩小后的图
					g.dispose();
					//改用线程-每一行 起一个线程
					new RowCutImgThread(i, rows, cols, lastRW, lastRH, img, desImgName, desType, desWidth, desHeight).start();
					/*for (int j = 0; j < cols; j++) {
						// 四个参数分别为图像起点坐标和宽高
						cropFilter = new CropImageFilter(j * desWidth, i * desHeight, lastRW > 0 && cols - 1 == j ? lastRW : desWidth, lastRH > 0 && rows - 1 == i ? lastRH : desHeight);
						img = Toolkit.getDefaultToolkit().createImage(new FilteredImageSource(image.getSource(), cropFilter));
						tagBi = new BufferedImage(lastRW > 0 && cols - 1 == j ? lastRW : desWidth, lastRH > 0 && rows - 1 == i ? lastRH : desHeight, BufferedImage.TYPE_INT_RGB);
						g = tagBi.getGraphics();
						g.drawImage(img, 0, 0, null); // 绘制缩小后的图
						g.dispose();
						// 输出为文件
						ImageIO.write(tagBi, desType, new File(desImgName + "_" + BaseDir.formartNumber(j) + "_" + BaseDir.formartNumber(i) + "."+desType));
					}*/
				}
			}else{
				ImageIO.write(srcBi, desType, new File(desImgName + "_000_000."+desType));
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

//按行启动线程
class RowCutImgThread extends Thread{
	private int currRow;
	private int cols;
	private int rows;
	private int lastRW;
	private int lastRH;
	private Image image;
	private String desImgName;
	private String desType;
	private int desWidth;
	private int desHeight;

	public RowCutImgThread(int currRow, int rows, int cols, int lastRW,
			int lastRH, Image image, String desImgName, String desType,
			int desWidth, int desHeight) {
		this.currRow = currRow;
		this.rows = rows;
		this.cols = cols;
		this.lastRW = lastRW;
		this.lastRH = lastRH;
		this.image = image;
		this.desImgName = desImgName;
		this.desType = desType;
		this.desWidth = desWidth;
		this.desHeight = desHeight;
	}

	@Override
	public void run() {
		try{
			BufferedImage tagBi = null;
			Graphics g = null;
			Image img = null;
			ImageFilter cropFilter = null; // 读取源图像
			for (int j = 0; j < cols; j++) {
				// 四个参数分别为图像起点坐标和宽高
				cropFilter = new CropImageFilter(j * desWidth, 0, lastRW > 0 && cols - 1 == j ? lastRW : desWidth, lastRH > 0 && rows - 1 == currRow ? lastRH : desHeight);
				img = Toolkit.getDefaultToolkit().createImage(new FilteredImageSource(image.getSource(), cropFilter));
				tagBi = new BufferedImage(lastRW > 0 && cols - 1 == j ? lastRW : desWidth, lastRH > 0 && rows - 1 == currRow ? lastRH : desHeight, BufferedImage.TYPE_INT_RGB);
				g = tagBi.getGraphics();
				g.drawImage(img, 0, 0, null); // 绘制缩小后的图
				g.dispose();
				// 输出为文件
				ImageIO.write(tagBi, desType, new File(desImgName + "_" + BaseDir.formartNumber(j) + "_" + BaseDir.formartNumber(currRow) + "."+desType));
			}
		}catch(Exception e){
			e.printStackTrace();
		}
	}
}
分享到:
评论

相关推荐

    java多线程+Socket+Swing做的局域网聊天程序

    【标题】"java多线程+Socket+Swing做的局域网聊天程序"涉及的核心知识点主要涵盖Java编程、多线程、网络通信以及图形用户界面设计。以下将详细阐述这些关键概念及其在实现局域网聊天程序中的应用。 **1. Java编程**...

    Java多线程

    Java多线程知识点梳理: 1. Java线程基础知识 - 线程是程序中独立的、并发的执行路径。每个线程都有自己的堆栈、程序计数器和局部变量,但与分隔的进程不同,线程之间的隔离程度较小,它们共享内存、文件句柄等...

    java多线程client+server聊天程序源代码设计案例

    Java多线程Client+Server聊天程序是一个典型的网络通信应用,涉及到并发处理、Socket编程和数据交换等关键概念。在这个设计案例中,我们将深入探讨以下几个重要知识点: 1. **Java多线程**:在聊天程序中,多线程是...

    java,socket多线程一对一聊天

    在本项目"java,socket多线程一对一聊天"中,我们探讨的是如何使用Java的Socket库来实现一个简单的、一对一的聊天应用。由于描述中提到“暂不支持并发”,我们可以理解这个系统可能只处理单个连接,而不是同时处理多...

    Java多线程读取大文件

    总之,Java多线程读取大文件是通过文件分区、内存文件映射和NIO技术来提升效率,同时通过多线程协作和合理的资源管理确保程序的稳定性和性能。这种策略尤其适用于需要高效处理大量数据的场景,如日志分析、数据导入...

    Java多线程实现快速切分文件的程序

    首先,我们来看标题中的核心概念——"Java多线程实现快速切分文件的程序"。这表明我们将使用Java的多线程特性来并行处理文件切分任务,以提高文件处理速度。多线程允许程序同时执行多个任务,对于大文件的处理,我们...

    java多線程導入不同csv文件到不同表1

    本项目"java多线程導入不同csv文件到不同表1"旨在利用多线程将不同的CSV(逗号分隔值)文件并行导入到不同的数据库表中,以优化数据加载过程。在日文操作系统下编写的代码可能需要注意字符编码问题,以防止注释或...

    Java多线程:多生产者和消费者的餐厅运行模拟

    要求设计多线程Java程序模拟该餐厅运营,同时考虑同步和死锁问题。程序运行时读取以下格式的文件:文件的第一行包含一个代表服务员数量的数字。第二行包括第一个服务员的姓名、顾客人数、第一个服务员的姓名、开胃菜...

    多线程的网络聊天程序

    下面,我们将深入探讨多线程的概念以及如何在Java中实现这样的聊天程序。 首先,多线程是指在一个进程中同时执行多个线程,每个线程都有自己的执行路径,可以独立地执行任务。在我们的网络聊天程序中,多线程被用于...

    多线程Socket程序源码

    在这个"多线程Socket程序源码"中,我们主要探讨的是如何利用Java的多线程技术和Socket API来构建一个支持多个客户端同时连接并进行聊天的系统。下面将详细解释相关知识点。 1. **Socket**:Socket是网络通信中的一...

    Java实现的聊天室程序

    2. **多线程处理**:由于聊天室需要同时处理多个客户端的连接和消息,因此多线程技术是必不可少的。服务器端需要为每个连接的客户端创建一个新的线程,以便并发处理多个用户的输入和输出。同样,客户端也需要独立的...

    java TCP 一对一聊天程序

    实现一个Java TCP一对一聊天程序,需要对网络编程有深入理解,包括TCP/IP原理、套接字交互、多线程控制以及数据编码解码等。在实际开发中,还可以考虑添加用户认证、加密传输、心跳机制等功能,以提高系统的安全性、...

    仓库管理源代码——JAVA程序设计

    学生需要掌握类、对象、接口、异常处理、多线程等Java核心概念。 2. **数据库管理**:仓库管理系统的核心是数据,因此需要数据库来存储和管理货物信息。常见的数据库如MySQL、Oracle或SQL Server可能被用到。学生需...

    java简易QQ聊天程序

    因此,我们需要用到Java的多线程技术,比如Thread类或Runnable接口,为每个客户端连接创建一个独立的线程来处理其发送和接收的数据,确保各个用户的交互互不干扰。 3. **用户界面设计**:项目提到了有界面,这通常...

    编写跨平台Java程序注意事项

    对于多线程程序,正确关闭非守护线程,仅在异常情况下使用 `exit` 方法。如果必须使用本地方法(Native Method)或本地代码,考虑使用服务器程序进行封装,或者利用 CORBA(Common Object Request Broker ...

    JAVA简单聊天室程序

    Java聊天室程序是一个基础但经典的项目,它可以帮助初学者理解网络编程、多线程以及客户端-服务器通信等核心概念。在这个程序中,通常会包含一个服务器端(Server)和多个客户端(Client),允许用户通过网络进行...

    java安装教程

    * 实验内容:Java程序设计实验的内容包括八个实验,分别是Java程序运行环境的下载、安装与配置,Java基本语法练习,类、对象、接口编程练习,Java语言的字符串类,Java多线程练习,输入/输出流练习等。 * 实验任务与...

    JAVA即时聊天程序源码

    综上所述,【JAVA即时聊天程序源码】涵盖了JAVA网络编程的基本概念,如Socket通信、多线程、异常处理以及控制台交互等关键知识点。通过学习和理解这个源码,开发者可以加深对JAVA网络编程的理解,为构建更复杂的应用...

Global site tag (gtag.js) - Google Analytics