如何使用 java 在旋转时保留图像的原始颜色
How to retain original color of Image on rotation using java
我有一个接收图像文件的 java 应用程序。我想使用 exif 信息旋转它们。
在 Whosebug 上,我发现了两种不同的方法,在这两种情况下,我都从 BufferedImage 开始:
BufferedImage image=ImageIO.read(sourceFile.getInputStream());
第一个解决方案来自 this post。
ImageTransformer.ImageInformation imageInformation=ImageTransformer.readImageInformation(sourceFile.getInputStream());
AffineTransform tranform=ImageTransformer.getExifTransformation(imageInformation);
image=ImageTransformer.transformImage(image,tranform);
第二个也被一些post推荐在这里,使用Thumbnailator:
BufferedImage image = Thumbnails.of(sourceFile.getInputStream()).scale(1).asBufferedImage();
这两种方式都能正确旋转我的图像。但是这两种解决方案都会改变我不想要的颜色。我将附上两个文件,"white" 一个是旋转错误的原始文件。这正是我在注释掉两个轮换代码时所实现的。
另一个,红色的,旋转正确,但是颜色不对。
如何只改变旋转就能得到原来的颜色?
我一直试图将图像的中心与框架的中心对齐,但我没有找到一个好的方法,但我设法在不丢失其属性的情况下旋转了图像:
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.geom.AffineTransform;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.JComponent;
public class Rotate extends JComponent {
// Attributes
private String route = null;
private double degree = 0.0;
// Constructor
public Rotate(String route, double degree) {
this.setRoute(route);
this.setDegree(degree);
}
// Create a bufferedImage for the given route
private BufferedImage getBufferedImage() {
Image image = null;
try {
image = ImageIO.read(new File(getRoute()));
} catch (IOException e) {
e.printStackTrace();
}
return (BufferedImage) image;
}
// Paint the image
public void paint(Graphics g) {
Graphics2D g2 = (Graphics2D) g;
AffineTransform at = AffineTransform.getRotateInstance(Math.toRadians(getDegree()));
g2.setTransform(at);
// Here I tried to calculate you must add the coordenates to start
// drawing the image in your frame
g2.drawImage(getBufferedImage(), 0, 0, null);
}
public double getDiagonal() {
return Math.hypot(getBufferedImage().getWidth(), getBufferedImage().getHeight());
}
public String getRoute() {
return route;
}
public void setRoute(String route) {
this.route = route;
}
public double getDegree() {
return degree;
}
public void setDegree(double degree) {
this.degree = degree;
}
}
用于测试:
import java.awt.Container;
import javax.swing.JFrame;
public class ImageRotation {
public static void main(String[] args) {
// The route of the image and the degrees of rotation
String route = "C:\Users\Public\Pictures\Sample Pictures\download.jpg";
double degrees = 30;
// Frame to display the image
JFrame jf = new JFrame("Image Rotated");
// Introduce the route and degrees
Rotate tl = new Rotate(route, degrees);
// Set the size of the frame
int hyp = (int) tl.getDiagonal();
jf.setSize(hyp, hyp);
// Print the rotated image in the frame
Container cp = jf.getContentPane();
cp.add(tl);
// Display
jf.setVisible(true);
}
}
我有同样的问题,事实证明你不应该将一种格式转换为另一种格式(BufferedImage 到 ByteArrayOutputStream,反之亦然)。如果你有字节数组——使用 ByteArrayOutputStream 和 ByteArrayInputStream。
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ByteArrayInputStream in = new ByteArrayInputStream(file.getContents());
Thumbnails.of(in)
.size(2000,1500)
.toOutputStream(baos);
byte[] bytes = baos.toByteArray();
我有一个接收图像文件的 java 应用程序。我想使用 exif 信息旋转它们。
在 Whosebug 上,我发现了两种不同的方法,在这两种情况下,我都从 BufferedImage 开始:
BufferedImage image=ImageIO.read(sourceFile.getInputStream());
第一个解决方案来自 this post。
ImageTransformer.ImageInformation imageInformation=ImageTransformer.readImageInformation(sourceFile.getInputStream());
AffineTransform tranform=ImageTransformer.getExifTransformation(imageInformation);
image=ImageTransformer.transformImage(image,tranform);
第二个也被一些post推荐在这里,使用Thumbnailator:
BufferedImage image = Thumbnails.of(sourceFile.getInputStream()).scale(1).asBufferedImage();
这两种方式都能正确旋转我的图像。但是这两种解决方案都会改变我不想要的颜色。我将附上两个文件,"white" 一个是旋转错误的原始文件。这正是我在注释掉两个轮换代码时所实现的。
另一个,红色的,旋转正确,但是颜色不对。
如何只改变旋转就能得到原来的颜色?
我一直试图将图像的中心与框架的中心对齐,但我没有找到一个好的方法,但我设法在不丢失其属性的情况下旋转了图像:
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.geom.AffineTransform;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.JComponent;
public class Rotate extends JComponent {
// Attributes
private String route = null;
private double degree = 0.0;
// Constructor
public Rotate(String route, double degree) {
this.setRoute(route);
this.setDegree(degree);
}
// Create a bufferedImage for the given route
private BufferedImage getBufferedImage() {
Image image = null;
try {
image = ImageIO.read(new File(getRoute()));
} catch (IOException e) {
e.printStackTrace();
}
return (BufferedImage) image;
}
// Paint the image
public void paint(Graphics g) {
Graphics2D g2 = (Graphics2D) g;
AffineTransform at = AffineTransform.getRotateInstance(Math.toRadians(getDegree()));
g2.setTransform(at);
// Here I tried to calculate you must add the coordenates to start
// drawing the image in your frame
g2.drawImage(getBufferedImage(), 0, 0, null);
}
public double getDiagonal() {
return Math.hypot(getBufferedImage().getWidth(), getBufferedImage().getHeight());
}
public String getRoute() {
return route;
}
public void setRoute(String route) {
this.route = route;
}
public double getDegree() {
return degree;
}
public void setDegree(double degree) {
this.degree = degree;
}
}
用于测试:
import java.awt.Container;
import javax.swing.JFrame;
public class ImageRotation {
public static void main(String[] args) {
// The route of the image and the degrees of rotation
String route = "C:\Users\Public\Pictures\Sample Pictures\download.jpg";
double degrees = 30;
// Frame to display the image
JFrame jf = new JFrame("Image Rotated");
// Introduce the route and degrees
Rotate tl = new Rotate(route, degrees);
// Set the size of the frame
int hyp = (int) tl.getDiagonal();
jf.setSize(hyp, hyp);
// Print the rotated image in the frame
Container cp = jf.getContentPane();
cp.add(tl);
// Display
jf.setVisible(true);
}
}
我有同样的问题,事实证明你不应该将一种格式转换为另一种格式(BufferedImage 到 ByteArrayOutputStream,反之亦然)。如果你有字节数组——使用 ByteArrayOutputStream 和 ByteArrayInputStream。
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ByteArrayInputStream in = new ByteArrayInputStream(file.getContents());
Thumbnails.of(in)
.size(2000,1500)
.toOutputStream(baos);
byte[] bytes = baos.toByteArray();