以编程方式从图像生成像素艺术

时间:2015-03-14 12:18:27

标签: java image-processing

我想为用户提供的任何图像生成64x64像素的艺术作品。我现在迷失了如何做到这一点。 OpenCV似乎没有提供任何此类功能。任何指向正确方向的人都会很高兴。

修改

像素艺术是给定图像的像素化图像。下面的屏幕截图显示了我到目前为止所取得的成就。

Pixelating an image

基本上我所做的就是如下。

  1. 在保持纵横比的情况下缩放图像,使其适合64x64网格

    Image sourceImage;
    Rectangle imageBound = sourceImage.getBounds();
    double sx = (double) 64 / (double) imageBound.width;
    double sy = (double) 64 / (double) imageBound.height;
    double s = Math.min(sx, sy);
    int dx = (int) (s * imageBound.width);
    int dy = (int) (s * imageBound.height);
    Image scaledImage = new Image(d, sourceImage.getImageData().scaledTo(dx, dy));
    
  2. 从缩放后的图像中读取每个像素并将其输出到屏幕上。

  3. 以下显示了我如何从每个像素中提取颜色。我使用SWT框架。

        Display d;
        ImageData data = scaledImage.getImageData();
        for(int i=0; i<data.width; i++) {
            for(int j=0; j<data.height; j++) {
                int pixel = data.getPixel(i,j);
                int red = (pixel & 0x00ff0000) >> 16;
                int green = (pixel & 0x0000ff00) >> 8;
                int blue = pixel & 0x000000ff;
                pixelGrid[i][j].setBackground(new Color(d, red, green, blue));
            }
        }
    

    但正如您所看到的,调整图像大小后,颜色会有很大差异。我想知道的是,我是否在正确的道路上实现这一目标,如果是这样,我如何在缩放时保留实际颜色。

1 个答案:

答案 0 :(得分:2)

您可能拥有RGBA格式的图像,并从图像中提取错误的值(就像它是ARGB一样)。它目前看起来很蓝,我看不到任何红色。那应该会让你走上正轨:

int red =   (pixel>>24) & 0xff;
int green = (pixel>>16) & 0xff;
int blue =  (pixel>>8)  & 0xff;
int alpha =  pixel & 0xff; // always 0xff for images without transparency