You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
jp2demo/src/main/java/com/docus/demo/utils/ImageUtils.java

295 lines
11 KiB
Java

package com.docus.demo.utils;
import com.docus.demo.LoadSaveDemo;
import com.docus.demo.entity.DemoData;
import leadtools.*;
import leadtools.codecs.CodecsLoadByteOrder;
import leadtools.codecs.CodecsSavePageMode;
import leadtools.codecs.RasterCodecs;
import leadtools.demos.DemoUtilities;
import lombok.extern.slf4j.Slf4j;
import javax.imageio.ImageIO;
import javax.imageio.ImageReader;
import javax.imageio.stream.ImageInputStream;
import java.awt.*;
import java.awt.geom.AffineTransform;
import java.awt.image.BufferedImage;
import java.io.*;
@Slf4j
public class ImageUtils {
private static final ImageUtils instance = new ImageUtils();
public static ImageUtils getInstance() {
return instance;
}
public boolean loadLibraries() {
try {
Platform.setLibPath(DemoUtilities.getLibPath());
Platform.loadLibrary(LTLibrary.LEADTOOLS);
Platform.loadLibrary(LTLibrary.CODECS);
Platform.loadLibrary(LTLibrary.SVG);
} catch (Exception e) {
e.printStackTrace();
return false;
}
return true;
}
// public static void main(String[] args) {
// ImageUtils imageUtils = new ImageUtils();
// imageUtils.savePic("C:\\Users\\Administrator\\Desktop\\QSL0015.jp2","C:\\Users\\Administrator\\Desktop\\QSL0015.jpg");
// }
private boolean parseCommandLine(String[] args, DemoData demoData) {
try {
// Process the command line
if (args.length == 0 || args[0].equals("?")) {
return false;
}
// Optional defaults
demoData.firstPage = 1;
demoData.lastPage = -1;
demoData.outputBPP = -1;
demoData.outputFormat = null;
for (int argIndex = 0; argIndex < args.length; argIndex += 2) {
String option = args[argIndex];
String data = (argIndex < args.length - 1) ? args[argIndex + 1] : "";
if (option.equals("-i")) {
demoData.inFilePath = data;
} else if (option.equals("-o")) {
demoData.outFilePath = data;
} else if (option.equals("-f")) {
demoData.outputFormat = LoadSaveDemo.OutputFormat.valueOf(data.toUpperCase());
} else if (option.equals("-b")) {
int value = Integer.parseInt(data);
demoData.outputBPP = value;
} else if (option.equals("-fp")) {
int value = Integer.parseInt(data);
demoData.firstPage = value;
} else if (option.equals("-lp")) {
int value = Integer.parseInt(data);
demoData.lastPage = value;
} else {
System.out.println("Invalid option " + option);
return false;
}
}
} catch (Exception ex) {
System.out.println("Error " + ex.getMessage());
return false;
}
return true;
}
private boolean isValidInputs(DemoData demoData) {
// Verify inFilePath
if (DemoUtilities.isNullOrEmpty(demoData.inFilePath)) {
System.out.println("inFilePath cannot be empty");
return false;
}
// Verify outFilePath
if (DemoUtilities.isNullOrEmpty(demoData.outFilePath)) {
System.out.println("outFilePath cannot be empty");
return false;
}
// Verify outputBPP
if (demoData.outputBPP == -1) {
System.out.println("Invalid bits per pixel");
return false;
}
// Verify outputFormat
if (demoData.outputFormat == null) {
System.out.println("Invalid output format");
return false;
}
return true;
}
/**
* tif文件转jpg
* @param inPutFile 文件输入
* @param outFile 文件输出
* @return
*/
public boolean tifToJpg(String inPutFile, String outFile) {
try
{
if (createParentRoot(outFile)) {
return false;
}
InputStream inputStream = new FileInputStream(inPutFile);
OutputStream outputStream = new FileOutputStream(outFile);
byte[] buffer = new byte[1024];
int bytesRead;
while ((bytesRead = inputStream.read(buffer)) != -1) {
outputStream.write(buffer, 0, bytesRead);
}
log.info(inPutFile + "成功将TIFF文件的字节码写入到新文件 " +outFile);
return true;
} catch (IOException e) {
e.printStackTrace();
}
return false;
}
/**
* 旋转jpg文件
*
* @param inPutFile 文件输入路径
* @param outFile 文件输出路径
* @param degreesToRotate 需要旋转的角度 整数是顺时针 负数是逆时针
* @return
*/
public boolean rotateFile(String inPutFile, String outFile, double degreesToRotate) {
try {
if (createParentRoot(outFile)) {
return false;
}
BufferedImage image = ImageIO.read(new File(inPutFile));
// 创建旋转后的图像
AffineTransform transform = new AffineTransform();
transform.rotate(Math.toRadians(degreesToRotate), image.getWidth() / 2.0, image.getHeight() / 2.0);
BufferedImage rotatedImage = new BufferedImage(image.getWidth(), image.getHeight(), image.getType());
Graphics2D g = rotatedImage.createGraphics();
g.drawImage(image, transform, null);
g.dispose();
ImageIO.write(rotatedImage, "jpg", new File(outFile));
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
public boolean savePic(String inputfile, String outFile) {
DemoData demoData = new DemoData();
demoData.firstPage = 1;
demoData.lastPage = 1;
demoData.outputBPP = 24;
demoData.inFilePath = inputfile;
demoData.outFilePath = outFile;
demoData.outputFormat = LoadSaveDemo.OutputFormat.JPEG;
try {
if (createParentRoot(outFile)) {
return false;
}
// Load LEADTOOLS libraries
if (!loadLibraries())
return false;
// Set the license
if (!DemoUtilities.setLicense()) {
System.out.println("Please Set Your Runtime License...\nExiting Demo...");
return false;
}
// Set the Shadow Fonts
DemoUtilities.setShadowFonts();
// Show the values:
// System.out.println("inFilePath: " + demoData.inFilePath);
// System.out.println("outFilePath: " + demoData.outFilePath);
// System.out.println("outputFormat: " + demoData.outputFormat);
// System.out.println("outputBPP: " + demoData.outputBPP);
// System.out.println("firstPage: " + demoData.firstPage);
// System.out.println("lastPage: " + demoData.lastPage);
// Run the demo
RasterCodecs rasterCodecs = null;
RasterImage rasterImage = null;
try {
// Initiate raster codecs
rasterCodecs = new RasterCodecs();
//Enable Loading Text Files
if (demoData.inFilePath.toLowerCase().endsWith(".txt"))
rasterCodecs.getOptions().getTxt().getLoad().setEnabled(true);
// Create a LEAD stream from the input file
ILeadStream stream = LeadStreamFactory.create(demoData.inFilePath);
// Get the number of pages in the input file
int pageCount = rasterCodecs.getTotalPages(stream);
// Verify user first/last page values are in range
if (demoData.firstPage == 0) demoData.firstPage = 1;
if (demoData.lastPage == -1) demoData.lastPage = pageCount;
if (demoData.firstPage < 1)
throw new IllegalArgumentException(String.format("firstPage must be greater than or equal to 1. Value is %1s", demoData.firstPage));
if (demoData.lastPage > pageCount)
throw new IllegalArgumentException(String.format("lastPage must be smaller than or equal to %1s. Value is %2s", pageCount, demoData.lastPage));
if (demoData.firstPage > demoData.lastPage)
throw new IllegalArgumentException(String.format("firstPage (value is %1s) cannot be greater than lastPage (value is %2s)", demoData.firstPage, demoData.lastPage));
// Load image
// System.out.println("Load image...");
rasterImage = rasterCodecs.load(stream, 0, CodecsLoadByteOrder.BGR_OR_GRAY, demoData.firstPage, demoData.lastPage);
// Save image
// System.out.println("Save image...");
rasterCodecs.save(rasterImage, demoData.outFilePath, RasterImageFormat.valueOf(demoData.outputFormat.toString()), demoData.outputBPP, 1, -1, 1, CodecsSavePageMode.OVERWRITE);
log.info("Image saved successfully here: " + demoData.outFilePath);
return true;
} catch (Exception e) {
// System.out.println(e.getMessage());
return false;
} finally {
// Dispose the raster codecs
if (rasterCodecs != null)
rasterCodecs.dispose();
// Dispose the raster image
if (rasterImage != null)
rasterImage.dispose();
}
} catch (Exception ex) {
log.info(ex.getMessage());
}
return false;
}
private boolean createParentRoot(String outFile) {
//判断父级目录是否存在 不存在需要创建
File file = new File(outFile);
String parentPath = file.getParent();
File dir = new File(parentPath);
if (!dir.exists()) {
boolean b = dir.mkdirs();
if (!b) {
System.out.println("created parent dir fail :" + outFile);
return true;
}
}
return false;
}
// public static void main(String[] args) {
// ImageUtils imageUtils = new ImageUtils();
//// imageUtils.savePic("C:\\Users\\Administrator\\Desktop\\HNSET0001.jp2.jp2","C:\\Users\\Administrator\\Desktop\\HNSET0001.jp2.jpg");
// imageUtils.tifToJpg("C:\\Users\\Administrator\\Desktop\\HNSET0001.tif","C:\\Users\\Administrator\\Desktop\\HNSET0001.jpg");
// imageUtils.rotateFile("C:\\Users\\Administrator\\Desktop\\HNSET0001.jp2.jpg","C:\\Users\\Administrator\\Desktop\\HNSET0001.jp2.jpg",90);
// }
}