我有一个很长的 png 文件,其中包含许多连续的 Sprite ,但它们的宽度/高度有一点变化。然而,所有 Sprite 周围都有一个固定的蓝色 1px 边框。
然而,在每个 Sprite 之后,边框通过 2px 相互连接(只是一个接一个的边框交互)看这个:
但是在 Sprite 的底部,它漏掉了一个像素点
有没有现成的算法可以像这样获取一个颜色边框之间的所有像素,包括边框给像素的时候?
或者任何其他想法如何像这样抓取一个文件的所有 Sprite 并给它们一个固定大小?
最佳答案
我拍摄了您的图片并对其进行了转换以符合您的描述。
在纯文本中,我从左到右确定可能指示图像开始或结束的行,并使用跟踪器变量来决定哪个是哪个。
我在 Java 中是这样处理的:
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.awt.image.Raster;
import java.io.File;
import java.io.IOException;
public class PixelArtSizeFinder {
public static void main(String[] args) throws IOException {
File imageFile = new File("pixel_boat.png");
BufferedImage image = ImageIO.read(imageFile);
int w = image.getWidth();
int h = image.getHeight();
System.out.format("Size: %dx%d%n", w, h);
Raster data = image.getData();
int objectsFound = 0;
int startObjectWidth = 0;
int endObjectWidth = 0;
boolean scanningObject = false;
for (int x = 0; x < w; x++) {
boolean verticalLineContainsOnlyTransparentOrBorder = true;
for (int y = 0; y < h; y++) {
int[] pixel = data.getPixel(x, y, new int[4]);
if (isOther(pixel)) {
verticalLineContainsOnlyTransparentOrBorder = false;
}
}
if (verticalLineContainsOnlyTransparentOrBorder) {
if (scanningObject) {
endObjectWidth = x;
System.out.format("Object %d: %d-%d (%dpx)%n",
objectsFound,
startObjectWidth,
endObjectWidth,
endObjectWidth - startObjectWidth);
} else {
objectsFound++;
startObjectWidth = x;
}
scanningObject ^= true; //toggle
}
}
}
private static boolean isTransparent(int[] pixel) {
return pixel[3] == 0;
}
private static boolean isBorder(int[] pixel) {
return pixel[0] == 0 && pixel[1] == 187 && pixel[2] == 255 && pixel[3] == 255;
}
private static boolean isOther(int[] pixel) {
return !isTransparent(pixel) && !isBorder(pixel);
}
}
结果是
Size: 171x72
Object 1: 0-27 (27px)
Object 2: 28-56 (28px)
Object 3: 57-85 (28px)
Object 4: 86-113 (27px)
Object 5: 114-142 (28px)
Object 6: 143-170 (27px)
关于java - 获取颜色边界之间所有像素的算法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45762872/