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编程、多线程、网络通信以及图形用户界面设计。以下将详细阐述这些关键概念及其在实现局域网聊天程序中的应用。 **1. Java编程**...
Java多线程知识点梳理: 1. Java线程基础知识 - 线程是程序中独立的、并发的执行路径。每个线程都有自己的堆栈、程序计数器和局部变量,但与分隔的进程不同,线程之间的隔离程度较小,它们共享内存、文件句柄等...
Java多线程Client+Server聊天程序是一个典型的网络通信应用,涉及到并发处理、Socket编程和数据交换等关键概念。在这个设计案例中,我们将深入探讨以下几个重要知识点: 1. **Java多线程**:在聊天程序中,多线程是...
在本项目"java,socket多线程一对一聊天"中,我们探讨的是如何使用Java的Socket库来实现一个简单的、一对一的聊天应用。由于描述中提到“暂不支持并发”,我们可以理解这个系统可能只处理单个连接,而不是同时处理多...
总之,Java多线程读取大文件是通过文件分区、内存文件映射和NIO技术来提升效率,同时通过多线程协作和合理的资源管理确保程序的稳定性和性能。这种策略尤其适用于需要高效处理大量数据的场景,如日志分析、数据导入...
首先,我们来看标题中的核心概念——"Java多线程实现快速切分文件的程序"。这表明我们将使用Java的多线程特性来并行处理文件切分任务,以提高文件处理速度。多线程允许程序同时执行多个任务,对于大文件的处理,我们...
本项目"java多线程導入不同csv文件到不同表1"旨在利用多线程将不同的CSV(逗号分隔值)文件并行导入到不同的数据库表中,以优化数据加载过程。在日文操作系统下编写的代码可能需要注意字符编码问题,以防止注释或...
要求设计多线程Java程序模拟该餐厅运营,同时考虑同步和死锁问题。程序运行时读取以下格式的文件:文件的第一行包含一个代表服务员数量的数字。第二行包括第一个服务员的姓名、顾客人数、第一个服务员的姓名、开胃菜...
下面,我们将深入探讨多线程的概念以及如何在Java中实现这样的聊天程序。 首先,多线程是指在一个进程中同时执行多个线程,每个线程都有自己的执行路径,可以独立地执行任务。在我们的网络聊天程序中,多线程被用于...
在这个"多线程Socket程序源码"中,我们主要探讨的是如何利用Java的多线程技术和Socket API来构建一个支持多个客户端同时连接并进行聊天的系统。下面将详细解释相关知识点。 1. **Socket**:Socket是网络通信中的一...
2. **多线程处理**:由于聊天室需要同时处理多个客户端的连接和消息,因此多线程技术是必不可少的。服务器端需要为每个连接的客户端创建一个新的线程,以便并发处理多个用户的输入和输出。同样,客户端也需要独立的...
实现一个Java TCP一对一聊天程序,需要对网络编程有深入理解,包括TCP/IP原理、套接字交互、多线程控制以及数据编码解码等。在实际开发中,还可以考虑添加用户认证、加密传输、心跳机制等功能,以提高系统的安全性、...
学生需要掌握类、对象、接口、异常处理、多线程等Java核心概念。 2. **数据库管理**:仓库管理系统的核心是数据,因此需要数据库来存储和管理货物信息。常见的数据库如MySQL、Oracle或SQL Server可能被用到。学生需...
因此,我们需要用到Java的多线程技术,比如Thread类或Runnable接口,为每个客户端连接创建一个独立的线程来处理其发送和接收的数据,确保各个用户的交互互不干扰。 3. **用户界面设计**:项目提到了有界面,这通常...
对于多线程程序,正确关闭非守护线程,仅在异常情况下使用 `exit` 方法。如果必须使用本地方法(Native Method)或本地代码,考虑使用服务器程序进行封装,或者利用 CORBA(Common Object Request Broker ...
Java聊天室程序是一个基础但经典的项目,它可以帮助初学者理解网络编程、多线程以及客户端-服务器通信等核心概念。在这个程序中,通常会包含一个服务器端(Server)和多个客户端(Client),允许用户通过网络进行...
* 实验内容:Java程序设计实验的内容包括八个实验,分别是Java程序运行环境的下载、安装与配置,Java基本语法练习,类、对象、接口编程练习,Java语言的字符串类,Java多线程练习,输入/输出流练习等。 * 实验任务与...
综上所述,【JAVA即时聊天程序源码】涵盖了JAVA网络编程的基本概念,如Socket通信、多线程、异常处理以及控制台交互等关键知识点。通过学习和理解这个源码,开发者可以加深对JAVA网络编程的理解,为构建更复杂的应用...