我使用我的 png 图像运行您的代码。这是我的测试结果。图像类型 6 是来自BufferedImage source code 的 TYPE_4BYTE_ABGR。
Image size: 416 x 199
Image type: 6
Origin pixel: 90,32
Destination pixel: 326,167
Pixel values: ffeeeeee ffffffff
Pixels are equal: false
这是图片。
这是旋转后的图像。
我不确定为什么颜色不同。我无法直观地区分 eeeeee 像素和 ffffff 像素之间的区别。
编辑添加:我做了更多研究,发现Image getRGB 方法的这一点文档。
返回默认 RGB 颜色模型中的整数像素(TYPE_INT_ARGB)
和默认的 sRGB 颜色空间。如果这发生了颜色转换
默认模型与图像 ColorModel 不匹配。
因此,getRGB 方法本身可能会导致颜色转换。
这是我运行的代码。
import java.awt.geom.AffineTransform;
import java.awt.image.AffineTransformOp;
import java.awt.image.BufferedImage;
import java.io.File;
import javax.imageio.ImageIO;
public class RotateImage {
public static void main(String[] args) throws Exception {
String input = "C:\\Users\\Owner\\OneDrive\\Pictures"
+ "\\Saved Pictures\\CustomJTextField.png";
BufferedImage origImage = ImageIO.read(new File(input));
AffineTransform af = new AffineTransform();
int centerX = origImage.getWidth() / 2;
int centerY = origImage.getHeight() / 2;
// Rotate 180 degrees
af.quadrantRotate(2, centerX, centerY);
AffineTransformOp affineTransformOp = new AffineTransformOp(
af, null);
System.out.println("Image size: " + origImage.getWidth() +
" x " + origImage.getHeight());
System.out.println("Image type: " + origImage.getType());
BufferedImage destImage = new BufferedImage(
origImage.getWidth(), origImage.getHeight(),
origImage.getType());
affineTransformOp.filter(origImage, destImage);
// Verify that destImage has indeed been rotated by point
// checking a random
// pixel.
int origX = 90;
int origY = 32;
// Where we expect this pixel to have been translated to.
int expX = destImage.getWidth() - origX;
int expY = destImage.getHeight() - origY;
System.out.println("Origin pixel: " + origX + "," + origY);
System.out.println("Destination pixel: " + expX + "," + expY);
int origPixel = origImage.getRGB(origX, origY);
int expPixel = destImage.getRGB(expX, expY);
System.out.println("Pixel values: " +
Integer.toHexString(origPixel) + " " +
Integer.toHexString(expPixel));
// Always prints false. Why????
System.out.println("Pixels are equal: " +
(origPixel == expPixel));
String output = "C:\\Eclipse\\Eclipse-2020-workspace"
+ "\\com.ggl.testing2\\resources\\output.png";
ImageIO.write(destImage, "png", new File(output));
}
}
编辑补充:我写了自己的变换,看看是变换改变颜色还是getRGB方法改变颜色。
这是我自己转换的测试结果。
Image size: 416 x 199
Image type: 6
Origin pixel: 90,32
Destination pixel: 326,167
Pixel values: ffeeeeee ffeeeeee
Pixels are equal: true
我从原始图像创建了一个 int 像素数组,并将这些像素写入旋转后的图像。
这是代码。
import java.awt.image.BufferedImage;
import java.io.File;
import javax.imageio.ImageIO;
public class RotateImage {
public static void main(String[] args) throws Exception {
String input = "C:\\Users\\Owner\\OneDrive\\Pictures"
+ "\\Saved Pictures\\CustomJTextField.png";
BufferedImage origImage = ImageIO.read(new File(input));
System.out.println("Image size: " + origImage.getWidth() +
" x " + origImage.getHeight());
System.out.println("Image type: " + origImage.getType());
int[] pixels = getPixels(origImage);
BufferedImage destImage = new BufferedImage(
origImage.getWidth(), origImage.getHeight(),
origImage.getType());
destImage = putPixels(destImage, pixels);
// Verify that destImage has indeed been rotated by point
// checking a random
// pixel.
int origX = 90;
int origY = 32;
// Where we expect this pixel to have been translated to.
int expX = destImage.getWidth() - origX;
int expY = destImage.getHeight() - origY;
System.out.println("Origin pixel: " + origX + "," + origY);
System.out.println("Destination pixel: " + expX + "," + expY);
int origPixel = origImage.getRGB(origX, origY);
int expPixel = destImage.getRGB(expX, expY);
System.out.println("Pixel values: " +
Integer.toHexString(origPixel) + " " +
Integer.toHexString(expPixel));
System.out.println("Pixels are equal: " +
(origPixel == expPixel));
String output = "C:\\Eclipse\\Eclipse-2020-workspace"
+ "\\com.ggl.testing2\\resources\\output.png";
ImageIO.write(destImage, "png", new File(output));
}
private static int[] getPixels(BufferedImage image) {
int length = image.getWidth() * image.getHeight();
int[] pixels = new int[length];
int index = 0;
for (int h = 0; h < image.getHeight(); h++) {
for (int w = 0; w < image.getWidth(); w++) {
pixels[index++] = image.getRGB(w, h);
}
}
return pixels;
}
private static BufferedImage putPixels(BufferedImage image,
int[] pixels) {
int index = 0;
for (int i = pixels.length - 1; i >= 0; i--) {
int h = index / image.getWidth();
int w = index % image.getWidth();
image.setRGB(w, h, pixels[i]);
index++;
}
return image;
}
}