我想为用户提供的任何图像生成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));
}
}
但正如您所看到的,调整图像大小后,颜色会有很大差异。我想知道的是,我是否在正确的道路上实现这一目标,如果是这样,我如何在缩放时保留实际颜色。
答案 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