Có thư viện Java nào để xoay các tệp JPEG với số gia là 90 độ mà không làm giảm sự xuống cấp ảnh không?Xoay JPEG không bị mất (90/180/270 độ) trong Java?
Trả lời
Tôi thấy điều này: http://mediachest.sourceforge.net/mediautil/
API: http://mediachest.sourceforge.net/mediautil/javadocs/mediautil/image/jpeg/LLJTran.html
rất gọn gàng, tuyệt vời! –
@Henry hey xin vui lòng bạn có thể cho tôi biết làm thế nào để tôi lưu hình ảnh bằng cách sử dụng này ..apparently bài đăng này không giúp tôi hoặc tôi đang làm sai cách – therealprashant
Bạn không cần một thư viện bên ngoài để loại điều, đó là tất cả được xây dựng vào SE. Cách dễ nhất là hàm rotate() của đối tượng Graphics2D.
Ví dụ:
Image rotatedImage = new BufferedImage(imageToRotate.getHeight(null), imageToRotate.getWidth(null), BufferedImage.TYPE_INT_ARGB);
Graphics2D g2d = (Graphics2D) rotatedImage.getGraphics();
g2d.rotate(Math.toRadians(90.0));
g2d.drawImage(imageToRotate, 0, -rotatedImage.getWidth(null), null);
g2d.dispose();
không mất!
Hoặc, nếu bạn muốn cẩn thận hơn, chỉ cần sử dụng BufferedImage.getRGB (x, y) và dịch pixel theo pixel sang hình ảnh mới.
Điều đó sẽ không bị mất, vì bạn phải giải mã và tái mã hóa hình ảnh, điều này sẽ dẫn đến mất dữ liệu. Các ảnh JPEG có thể được xoay không bị mất trong các bước 90 độ, khi được thực hiện chính xác. –
Điều này là tốt cho PNG/GIF tôi đoán, nhưng không thua lỗ với JPEG không may. – Henry
Tôi không hiểu tại sao bạn sẽ nói điều này là không mất mát? Đặc biệt là nếu bạn đang thực hiện pixel này theo pixel? –
Xây dựng về câu trả lời của Henry, đây là một ví dụ về cách sử dụng MediaUtil để thực hiện luân chuyển JPEG lossless dựa trên các dữ liệu EXIF:
try {
// Read image EXIF data
LLJTran llj = new LLJTran(imageFile);
llj.read(LLJTran.READ_INFO, true);
AbstractImageInfo<?> imageInfo = llj.getImageInfo();
if (!(imageInfo instanceof Exif))
throw new Exception("Image has no EXIF data");
// Determine the orientation
Exif exif = (Exif) imageInfo;
int orientation = 1;
Entry orientationTag = exif.getTagValue(Exif.ORIENTATION, true);
if (orientationTag != null)
orientation = (Integer) orientationTag.getValue(0);
// Determine required transform operation
int operation = 0;
if (orientation > 0
&& orientation < Exif.opToCorrectOrientation.length)
operation = Exif.opToCorrectOrientation[orientation];
if (operation == 0)
throw new Exception("Image orientation is already correct");
OutputStream output = null;
try {
// Transform image
llj.read(LLJTran.READ_ALL, true);
llj.transform(operation, LLJTran.OPT_DEFAULTS
| LLJTran.OPT_XFORM_ORIENTATION);
// Overwrite original file
output = new BufferedOutputStream(new FileOutputStream(imageFile));
llj.save(output, LLJTran.OPT_WRITE_ALL);
} finally {
IOUtils.closeQuietly(output);
llj.freeMemory();
}
} catch (Exception e) {
// Unable to rotate image based on EXIF data
...
}
Tôi đã chạy một thử nghiệm với lấy thẻ quay EXIF với cả Sanselan và MediaUtil, nhưng phương pháp MediaUtil ở trên không thành công cho tôi tại llj.getImageInfo(); bước (không tìm thấy bất kỳ siêu dữ liệu EXIF nào), nơi tiếp cận Sanselan không tìm thấy siêu dữ liệu EXIF. Có vẻ như LLJtran không hỗ trợ đọc tất cả các ảnh JPEG hiện đại. – JeroenHoek
Tôi không thể xem hình ảnh đã lưu trong thư viện của mình..có cùng mã chính xác .. – therealprashant
Tôi gặp khó khăn trong việc tìm nơi nhập java.awt.Rectangle; Tôi đã thử một số lọ trong web nhưng tôi không thể sử dụng chúng với Android Studio. Bạn có thể giúp tôi với cái lọ mà bạn đã nhập khẩu không. Cảm ơn –
Về vấn đề dữ liệu EXIF không nhất thiết phải được xử lý một cách chính xác, vì dữ liệu EXIF là không thích hợp trong nhiều trường hợp, đây là mã ví dụ chứng minh chỉ có tính năng LLJTran lossless xoay JPEG (với nhờ user113215):
final File SrcJPEG = new File("my-input.jpg");
final File DestJPEG = new File("my-output.jpg");
final FileInputStream In = new FileInputStream(SrcJPEG);
try {
final LLJTran LLJT = new LLJTran(In);
LLJT.read(LLJTran.READ_ALL, true);
LLJT.transform(LLJTran.ROT_90);
final FileOutputStream Out = new FileOutputStream(DestJPEG);
try {
LLJT.save(Out, LLJTran.OPT_WRITE_ALL);
} finally {
Out.close();
}
} finally {
In.close();
}
Nếu bạn thực hiện các đầu vào và đầu ra File
đối tượng refe r vào cùng một tệp, bạn có thể chạy lặp đi lặp lại và quan sát thấy hình ảnh không bị suy giảm, cho dù có bao nhiêu lần lặp lại nó được đặt qua.
Tôi không thể lưu hình ảnh và xem hình ảnh trong thư viện bằng phương pháp này ... Xin hãy giúp – therealprashant
không có trong Java, nhưng http://jpegclub.org/jpegtran/ phải là tiện ích dòng lệnh tốt nhất để quay số không bị mất (Windows/Linux) – Henry
Xin chào nếu bạn đã sử dụng giải pháp dưới đây tôi muốn yêu cầu trợ giúp của bạn nếu bạn có thể. Tôi gặp khó khăn khi tìm nơi nhập java.awt.Rectangle; Tôi đã thử một số lọ trong web nhưng tôi không thể sử dụng chúng với Android Studio. Bạn có thể giúp tôi với cái lọ mà bạn đã nhập khẩu không. Cảm ơn –