java - 获取颜色边界之间所有像素的算法?

标签 java algorithm graphics

我有一个很长的 png 文件,其中包含许多连续的 Sprite ,但它们的宽度/高度有一点变化。然而,所有 Sprite 周围都有一个固定的蓝色 1px 边框。

然而,在每个 Sprite 之后,边框通过 2px 相互连接(只是一个接一个的边框交互)看这个:

img

但是在 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/

相关文章:

arrays - 包含 n-2 个整数 1 到 n 的数组,O(n) 算法如何用 O(1) 额外空间查找缺失的 2 个数字?

JavaFX 错误报告了我在 Linux 上的屏幕尺寸。这是一个错误吗?

C# 从右角开始旋转 DrawString

java - 一个好的初学者图文教程?

java - 如何处理 Android 中的 3 个硬键

java - org.testng.TestNGException : An error occurred while instantiating class. 检查以确保它可以被实例化/访问

等同于 PCRE/etc 的 Java 正则表达式。简写 `\K` ?

java - Java中的UDP数据包路由

ruby - 如何在 Ruby 中顺序创建 PI

c# - 在 .NET CF 中预处理和搜索文本文件的最佳方式