在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;
}
答案 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)));