2010-05-24 27 views
13

Tôi đã thử các mã sau để hoàn thành nhiệm vụ đọc và viết tiff hình ảnh:Đọc và Viết ra hình ảnh TIFF trong Java

// Define the source and destination file names. 
String inputFile = /images/FarmHouse.tif 
String outputFile = /images/FarmHouse.bmp 

// Load the input image. 
RenderedOp src = JAI.create("fileload", inputFile); 

// Encode the file as a BMP image. 
FileOutputStream stream = 
    new FileOutputStream(outputFile); 
JAI.create("encode", src, stream, BMP, null); 

// Store the image in the BMP format. 
JAI.create("filestore", src, outputFile, BMP, null); 

Tuy nhiên, khi tôi chạy mã, tôi nhận được thông báo lỗi sau:

Caused by: java.lang.IllegalArgumentException: Only images with either 1 or 3 bands 
can be written out as BMP files. 
at com.sun.media.jai.codecimpl.BMPImageEncoder.encode(BMPImageEncoder.java:123) 
at com.sun.media.jai.opimage.EncodeRIF.create(EncodeRIF.java:79) 

Bất kỳ ý tưởng nào về cách giải quyết vấn đề này?

Trả lời

20

Cách dễ nhất để đọc trong một TIFF và đầu ra một BMP sẽ được sử dụng lớp ImageIO:

BufferedImage image = ImageIO.read(inputFile); 
ImageIO.write(image, "bmp", new File(outputFile)); 

Điều duy nhất bổ sung mà bạn sẽ cần phải làm gì để có được điều này để làm việc được chắc chắn rằng bạn' đã thêm JAI ImageIO JAR vào classpath của bạn, vì BMP và TIFF không được JRE xử lý mà không có các plugin từ thư viện này.

Nếu bạn không thể sử dụng JAI ImageIO vì lý do nào đó, bạn có thể làm cho nó hoạt động với mã hiện có của bạn nhưng bạn sẽ phải thực hiện thêm một số công việc. Mô hình màu đang được tạo cho TIFF mà bạn đang tải có lẽ là một mô hình màu được lập chỉ mục không được hỗ trợ bởi BMP. Bạn có thể thay thế bằng thao tác JAI.create ("định dạng", ...) bằng cách cung cấp gợi ý hiển thị bằng khóa JAI.KEY_REPLACE_INDEX_COLOR_MODEL.

Bạn có thể có một số may mắn bằng văn bản cho hình ảnh đọc từ tập tin vào một hình ảnh tạm thời và sau đó viết ra các hình ảnh tạm thời:

BufferedImage image = ImageIO.read(inputFile); 
BufferedImage convertedImage = new BufferedImage(image.getWidth(), 
    image.getHeight(), BufferedImage.TYPE_INT_RGB); 
convertedImage.createGraphics().drawRenderedImage(image, null); 
ImageIO.write(convertedImage, "bmp", new File(outputFile)); 

Tôi tự hỏi nếu bạn đang chạy vào cùng một vấn đề chỉ số mô hình màu như với JAI thông thường. Lý tưởng nhất là bạn nên sử dụng lớp ImageIO để có được các phiên bản ImageReader và ImageWriter cho tất cả trừ các trường hợp đơn giản nhất để bạn có thể tinh chỉnh các tham số đọc và ghi cho phù hợp, nhưng ImageIO.read() và .write() có thể được cung cấp cho bạn bạn muốn gì.

+0

"ImageIO.write (hình ảnh, "bmp", File mới (outputFile))" là cứng không viết có thể ghi thành công hình ảnh dưới dạng tệp ".bmp". khi tôi thay đổi mã thành ".tiff" thay vào đó, nó sẽ hoạt động. – user224270

+0

xin lỗi ... có một lỗi đánh máy nhỏ. ImageIO.write giờ đây sẽ viết ra hình ảnh đã chuyển đổi, chứ không phải hình ảnh gốc. – Jeff

+0

Cảm ơn Jeff. nó đã làm việc! bạn thực sự đã cứu ngày của tôi;) – user224270

0
FileInputStream in = new FileInputStream(imgFullPath); 
FileChannel channel = in.getChannel(); 
ByteBuffer buffer = ByteBuffer.allocate((int)channel.size()); 
channel.read(buffer); 
tiffEncodedImg = Base64.encode(buffer.array()); 

Sử dụng nội dung này (tức là giá trị của "tiffEncodedImg") là giá trị src của thẻ img trong HTML

Các vấn đề liên quan