gpt4 book ai didi

java - 裁剪图像的透明边缘

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

我正在尝试创建一个函数,仅从右侧和左侧裁剪 BufferedImage 的透明边缘。

所以,我在网上找到了这种方法,但是我不太明白 pixels[] 数组填充了什么?我假设它是每个像素的 alpha、红色、绿色、蓝色值(根据 (j*width+i)*4 中的 4 判断,它会选择每个像素)第四个元素),但对于 68x67 图像,该数组的长度为 299208(我知道它不是 2 的幂,请忽略它)。

那么,我该如何实现这一点,我很好奇这个像素数组中实际存储了什么?

public static BufferedImage trimHorizontally(BufferedImage img) {
final byte[] pixels = ((DataBufferByte)img.getRaster().getDataBuffer()).getData();
int width = img.getWidth(), height = img.getHeight();
int x0, x1;
int j, i;

leftLoop:
for(i = 0; i < width; i++) {

for(j = 0; j < height; j++) {

if(pixels[(j*width+i)*4] != 0) {
break leftLoop;
}
}
}
x0 = i;
rightLoop:
for(i = width-1; i >= 0; i--) {

for(j = 0; j < height; j++) {

if(pixels[(j*width+i)*4] != 0) {
break rightLoop;
}
}
}
x1 = i+1;

return img.getSubimage(x0, 0, x1-x0, height);


}

我在上面的代码中基本上做的是从左侧和右侧扫描图像,检查 alpha 值并标记我需要裁剪的距离,但它会抛出异常,因为循环结束时没有检测任何不透明像素(并且我正在裁剪的图像肯定不透明)。

我进行了检查,发现大于 0 的 alpha 值实际上高于 pixels[]35000 索引数组,通过 (j*width+i)*4 计算,我只能达到 18000....

最佳答案

快速修复

您可以使用以下方式制作像素:

final int[] pixels = ((DataBufferInt)img.getAlphaRaster().getDataBuffer()).getData();

并删除 (j*width+i)*4 中的 *4。这只会使您的 pixels[] 仅包含 alpha 值,而不包含 RGB。

但是,有一个更安全(没有不安全的 DataBuffer 转换)、更易读的解决方案:

首选版本

我所做的更改是停止可怕的 byte 数组,并简单地使用 getRGB()方法代替。可以通过使用the RGB+alpha constructor创建Color来获取alpha值。 ,然后是 getAlpha()方法。

现在以下代码对我有用:

public static BufferedImage trimHorizontally(BufferedImage img) {
int width = img.getWidth(), height = img.getHeight();
int x0, x1;
int j, i;
int alpha;

leftLoop:
for(i = 0; i < width; i++) {

for(j = 0; j < height; j++) {
if(new Color(img.getRGB(i, j), true).getAlpha() != 0) {
break leftLoop;
}
}
}
x0 = i;
rightLoop:
for(i = width-1; i >= 0; i--) {

for(j = 0; j < height; j++) {
if(new Color(img.getRGB(i, j), true).getAlpha() != 0) {
break rightLoop;
}
}
}
x1 = i+1;

return img.getSubimage(x0, 0, x1-x0, height);
}

注释:

img 类型必须为 TYPE_INT_ARGB ,或其他一些将其 alpha 值保留在 getRGB() 数据的最后一个字节中的类型(如果您不知道这意味着什么,只需尝试上面的代码,如果它不工作 covert to ARGB .)

还要确保您使用 image format that supports transparency (不是 JPG)。

关于java - 裁剪图像的透明边缘,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47164777/

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