有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

我想为用户提供的任何图像生成一幅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. 从缩放图像中读取每个像素并将其输出到屏幕上

下面显示了如何从每个像素提取颜色。我使用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) 个答案

  1. # 1 楼答案

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