用于缩放表示像素的字节数组的函数

时间:2015-01-30 21:25:12

标签: java arrays bytearray scale pixel

在Java中,我有一个byte[]数组,它实际上是在具有给定维度的精灵中存储像素的颜色代码。我遇到的问题是:

如果我想按int scale缩放该精灵,我该怎么做?我可以弄清楚如何复制数组scale次的每个元素,但我需要做的是基本上确保每行都正确缩放,然后将每行的scale个数放入数组中

你知道这样做的任何方式吗?

编辑:

我尝试过这个功能,但它似乎不起作用:

public static byte[] scaleImage(byte[] pix, int width, int scale){
    int height = pix.length / width;
    byte[] ret = new byte[pix.length * scale * scale];
    for(int i=0; i<height; i++){
        if(i % scale == 0){
            for(int j=0; j<width; j++){
                if(j % scale == 0)ret[i * width * scale + j] = pix[(i / scale) * width + (j / scale)];
                else ret[i * width * scale + j] = ret[i * width * scale + j -1];
            }
        }
        else for(int j=0; j<width; j++){
            ret[i * width * scale + j] = ret[(i-1) * width * scale + j];
        }
    }
    return ret;
}

1 个答案:

答案 0 :(得分:0)

您可以使用BufferedImage和AffineTransformOp对int []数组执行此操作。这样做的好处是您的数据被视为图像而不是数组,因此您可以使用不同的缩放算法,插值等,非整数比例值等。

将2 x 2图像缩放为4 x 4

的示例

首先将数据写入图像

int[] rawData = new int[2 * 2 * 4]; // input is 4 int per pixel, ARGB 
BufferedImage input = new BufferedImage(2, 2, BufferedImage.TYPE_INT_ARGB);
((WritableRaster) input.getData()).setPixels(0, 0, 2, 2, rawData);

缩放

int scale = 2;
AffineTransform transform = new AffineTransform();
transform.scale(scale, scale);
AffineTransformOp op = new AffineTransformOp(transform, null);
BufferedImage output = new BufferedImage(input.getWidth() * scale, input.getHeight() * scale, input.getType());
op.filter(input, output);

然后可以访问像素

System.out.println(Arrays.toString(output.getData().getPixels(0, 0, output.getWidth(), output.getHeight(), (int[]) null)));