gpt4 book ai didi

java - 如何以编程方式旋转存储为一维数组的位图图像?

转载 作者:行者123 更新时间:2023-11-30 09:01:52 26 4
gpt4 key购买 nike

我有一个类,位图,它只包含一个 rgba 值的像素数组,我在互联网上搜索了一个无济于事的答案。

我怎样才能创建一个函数,比如说;

private int[] pixels;
private int width;
private int height;

/**
*Rotates this image around (x, y) by theta degrees
*/
public void rotate(int theta, int x, int y){
// Code to rotate 1D array here
}

最佳答案

首先,不可能就地进行旋转——您需要将旋转后的图像绘制到不同的缓冲区中。要模拟就地旋转,仍然需要复制数组。

此外,除非旋转 180°,否则旋转矩形图像的结果将占据比原始图像更大的矩形,因此当绘制回原始缓冲区时其角将被剪掉。

无论如何,这是一种方法,将像素数组包装在 BufferedImage 中并调用 AWT 的帮助(导入 java.awt.* 和 java.awt.image.*):

/** Creates an RGBA BufferedImage backed by the specified pixel array. */
static BufferedImage asBufferedImage(int[] pixels, int width, int height) {
ColorModel cm = ColorModel.getRGBdefault();
int[] bandMasks = new int[] { 0x00ff0000, 0x0000ff00, 0x000000ff, 0xff000000 };
DataBuffer dataBuffer = new DataBufferInt(pixels, pixels.length);
WritableRaster raster = Raster.createPackedRaster(
dataBuffer,
width,
height,
width,
bandMasks,
null);
return new BufferedImage(cm, raster, false, null);
}

/** Rotates this image clockwise by an angle in degrees about the point (x, y). */
public void rotate(double theta, double x, double y) {
BufferedImage srcImage = asBufferedImage(pixels.clone(), width, height);
BufferedImage dstImage = asBufferedImage(pixels, width, height);
Arrays.fill(pixels, 0x00000000);
Graphics2D g = dstImage.createGraphics();
g.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);
g.setComposite(AlphaComposite.Src);
g.transform(AffineTransform.getRotateInstance(theta * (Math.PI / 180), x, y));
g.drawImage(srcImage, null, 0, 0);
g.dispose();
}

asBufferedImage() 方法返回一个由相同像素数组支持的新 BufferedImage,因此通过像素数组或 BufferedImage 所做的更改都在修改相同的内容。我们这样做是为了将数组与 Java 的图形管道一起使用。我们通过 pixels.clone() 获取源图像的​​副本,以供读取。 Arrays.fill 调用将目标缓冲区清除为透明黑色,因此我们没有原始图像的部分在两侧可见。 setRenderingHints 调用是可选的;它打开双线性抗锯齿所以它看起来更好,虽然它确实会降低速度。 setComposite(AlphaComposite.Src) 调用是一个小的优化以防止混合。默认合成模式 SrcOver 会将新像素与图像中已有的像素混合,而 Src 只是替换现有像素。由于我们知道图像缓冲区被清除为透明黑色,因此混合或不混合具有相同的效果。 AffineTransform 是封装二维坐标变换的矩阵,在本例中是围绕一个点的旋转,我们使用它来变换 Graphics 对象绘制的内容。然后我们画出来!

关于java - 如何以编程方式旋转存储为一维数组的位图图像?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26200371/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com