Trong Java, cách tốt nhất để chuyển đổi tệp TIF thành PNG là gì?Làm cách nào để chuyển đổi TIF sang PNG trong Java?
Đơn giản là thích hợp hơn, nhưng nếu cách đơn giản nhất là sử dụng thư viện của bên thứ ba thì tôi sẽ xem xét giải pháp đó.
Trong Java, cách tốt nhất để chuyển đổi tệp TIF thành PNG là gì?Làm cách nào để chuyển đổi TIF sang PNG trong Java?
Đơn giản là thích hợp hơn, nhưng nếu cách đơn giản nhất là sử dụng thư viện của bên thứ ba thì tôi sẽ xem xét giải pháp đó.
Đầu tiên, cài đặt JAI. Sau đó cài đặt JAI/ImageIO. Sau đó làm
public static void main(final String[] args) throws Exception
{
final BufferedImage tif = ImageIO.read(new File("test.tif"));
ImageIO.write(tif, "png", new File("test.png"));
}
Java Advanced Imaging API là một thư viện tốt cho thao tác hình ảnh
Vâng tôi đã nhìn vào điều đó, tôi thành thật không có ý tưởng làm thế nào để cài đặt nó. Họ có một ZIP tải về có chứa một tập tin JAR với một tập tin EXE bên trong của nó. Tôi chưa bao giờ thấy điều đó trước đây. –
Sử dụng imageMagic thư viện java như im4java, hiệu suất và chất lượng của họ là tốt hơn nhiều sau đó JAI
ví dụ:
import org.im4java.core.ConvertCmd;
import org.im4java.core.IMOperation;
public static void convertTifToPng(File inputImage, File outputImage){
IMOperation op = new IMOperation();
op.addImage(); //place holder for input file
op.addImage(); //place holder for output file
ConvertCmd convert = new ConvertCmd();
convert.run(op, new Object[]{inputImage.getAbsolutePath(), outputImage.getAbsolutePath()});
}
phụ thuộc maven cho im4java là
<dependency>
<groupId>im4java</groupId>
<artifactId>im4java</artifactId>
<version>0.98.0</version>
</dependency>
Tôi đồng ý rằng chất lượng IM là tuyệt vời, nhưng tôi sẽ rất lo lắng về việc sử dụng nó trong quá trình như vậy (bởi vì, theo ý kiến của tôi, chất lượng kỹ thuật không tốt, và có thể có tai nạn nghiêm trọng). Thay vào đó, tôi sẽ chuyển thành 'convert' bằng cách sử dụng ProcessBuilder, nếu tôi định sử dụng IM. –
@giladbu: ImageMagick thật tuyệt vời và tôi làm theo cách Jonathan đề xuất nhưng tôi chỉ muốn bình luận về phần "chất lượng": Tôi rất nghi ngờ rằng JAI sẽ tạo ra một hình ảnh có chất lượng kém hơn ImageMagick khi * đọc * mất dữ liệu TIFF (nên TIFF của OP bị mất). Đối với PNG, nó là không mất mát và JAI không thể đi sai ở đó. Vì vậy, trong trường hợp TIFF-to-PNG, tôi không đồng ý rằng chất lượng của ImageMagick sẽ tốt hơn JAI. Đối với TIFF-to-JPG bây giờ chúng ta sẽ nói về một cái gì đó hoàn toàn khác nhau và tôi sẽ sử dụng ImageMagick mà không cần suy nghĩ hai lần về nó. – SyntaxT3rr0r
Hmm Tôi không nhận ra rằng PNG không bị mất dữ liệu. –
Tải xuống Bộ phát triển phần mềm JIMI jimi1_0.zip a nd thiết JimiProClasses.zip vào classpath của bạn
JIMI là thư viện hình ảnh java cũ hơn, nhưng nó rất dễ dàng để sử dụng và không có mã phụ thuộc nền tảng (không thực thi bản xứ, có thể sử dụng nó như bình chuẩn)
import java.awt.Image;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import com.sun.jimi.core.Jimi;
public class JIMIImageConverter {
public static byte[] convert(byte[] inBytes, String inMimeType, String outMimeType) throws Exception{
Image rawImage = Jimi.getImage(new ByteArrayInputStream(inBytes), inMimeType);
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
Jimi.putImage(outMimeType, rawImage, outputStream);
return outputStream.toByteArray();
}
}
nơi inMimeType và outMimeType là định dạng đồ họa mimetypes
nó hoạt động tốt cho jpg, jpeg, png nhưng nó không hoạt động cho tiff –
có lẽ bạn có thể sử dụng mã này, làm việc cho tôi
import java.awt.Color;
import java.awt.image.BufferedImage;
import java.awt.image.RenderedImage;
import java.awt.image.renderable.ParameterBlock;
import java.io.File;
import java.io.IOException;
import javax.media.jai.JAI;
import javax.media.jai.RenderedOp;
import com.sun.media.jai.codec.FileSeekableStream;
import com.sun.media.jai.codec.ImageCodec;
import com.sun.media.jai.codec.ImageDecoder;
import com.sun.media.jai.codec.SeekableStream;
public class ImageConvert {
public static RenderedImage[] readMultiPageTiff(String fileName)throws IOException{
File file = new File(fileName);
SeekableStream seekableStream = new FileSeekableStream(file);
ImageDecoder decoder = ImageCodec.createImageDecoder("tiff", seekableStream, null);
int numPages = decoder.getNumPages();
RenderedImage image[]= new RenderedImage[numPages];
int count = 0;
for(int i=0;i<decoder.getNumPages();i++){
image[i] = decoder.decodeAsRenderedImage(i);
count++;
}
String newFolderName;
String s3 = fileName;
String [] temp = null;
temp = s3.split("\\.");
int j;
j = 0;
do{
newFolderName = temp[j];
String spoonFeeding = newFolderName;
File f = new File(spoonFeeding);
f.mkdirs();
j++;
}while (j<1);
for (int i = 0; i < count; i++) {
RenderedImage page = decoder.decodeAsRenderedImage(i);
File fileObj = new File(newFolderName+"/" + (i+1) + ".png");
System.out.println("Saving " + fileObj.getCanonicalPath());
ParameterBlock parBlock = new ParameterBlock();
parBlock.addSource(page);
parBlock.add(fileObj.toString());
parBlock.add("png");
RenderedOp renderedOp = JAI.create("filestore",parBlock);
renderedOp.dispose();
}
return image;
}
}
Bạn có thể giải thích những gì đang diễn ra với cài đặt không chuẩn? Thông thường các thư viện Java chỉ là các tệp JAR mà bạn đặt bên trong CLASSPATH của bạn, nhưng JAI cũng cài đặt các tệp DLL gốc. Cách này hoạt động như thế nào nếu bạn triển khai tới một máy chủ web? –
Bạn cũng có thể nhận được JAI thuần java, nhưng không có lý do gì để làm như vậy, nếu nền tảng của bạn được hỗ trợ bởi mã gốc. Nếu bạn triển khai ứng dụng của mình lên một máy chủ web, thì JRE của máy chủ cũng phải có phần mở rộng JAI và JAI/ImageIO được cài đặt. –
@ Jonathan Feinberg, Bạn có cần phải bao gồm các JAR trên đường dẫn lớp hoặc cài đặt các phần mở rộng làm cho nó trở thành một phần của JRE không? –