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

Java 以编程方式从图像生成像素艺术,java,image-processing,Java,Image Processing,我想为用户提供的任何图像生成一幅64x64像素的艺术品。我现在不知道该怎么做。OpenCV似乎没有提供任何这样的功能。任何指向正确方向的指示都将不胜感激 编辑 像素艺术是给定图像的像素化图像。下面的屏幕截图显示了我迄今为止所取得的成就 基本上我所做的如下 使用保持的纵横比缩放图像,使其适合64x64网格 Image sourceImage; Rectangle imageBound = sourceImage.getBounds(); double sx = (double) 64 / (do

我想为用户提供的任何图像生成一幅64x64像素的艺术品。我现在不知道该怎么做。OpenCV似乎没有提供任何这样的功能。任何指向正确方向的指示都将不胜感激

编辑

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

基本上我所做的如下

  • 使用保持的纵横比缩放图像,使其适合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));
    
  • 从缩放图像中读取每个像素并将其输出到屏幕上

  • 下面显示了如何从每个像素提取颜色。我使用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));
            }
        }
    
    显示d;
    ImageData=scaleImage.getImageData();
    对于(int i=0;i 16;
    int绿色=(像素&0x0000ff00)>>8;
    int蓝色=像素&0x000000ff;
    pixelGrid[i][j].背景(新颜色(d,红色,绿色,蓝色));
    }
    }
    

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

    您可能有一张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
    

    你想要什么样的像素艺术?“OpenCV似乎没有提供任何这样的功能”-是的。你找错了方向。这是一个计算机视觉库,而不是像素艺术库。你可能想包括它,以确保处理的图像格式一致。