我正尝试通过使用我在这里find的双线技术来重新调整图像的大小,但是除了黑色图像之外,我什么都看不到。 所以,首先我用LodePNG解码我的图像,像素进入一个vector<unsigned char>
variables。 它说,它们被存储为RGBARGBA,但是当我试图将图像应用到X11窗口时,我意识到它们被存储为BGRABGRA。 我不知道是改变顺序的X11 API还是LodePNG解码器。 无论如何,在任何事情之前,我将BGR转换为RGB:
// Here is where I have the pixels stored vector<unsigned char> Image; // Converting BGRA to RGBA, or vice-versa, I don't know, but it's how it is shown // correctly on the window unsigned char red, blue; unsigned int i; for(i=0; i<Image.size(); i+=4) { red = Image[i + 2]; blue = Image[i]; Image[i] = red; Image[i + 2] = blue; }
所以,现在我正试图改变图像的大小,然后将其应用到窗口。 大小将是窗口的大小(拉伸)。 我首先尝试将RGBA转换为int值,如下所示:
vector<int> IntImage; for(unsigned i=0; i<Image.size(); i+=4) { IData.push_back(256*256*this->Data[i+2] + 256*this->Data[i+1] + this->Data[i]); }
现在我从上面指定的链接中获得了这个function,
vector<int> resizeBilinear(vector<int> pixels, int w, int h, int w2, int h2) { vector<int> temp(w2 * h2); int a, b, c, d, x, y, index ; float x_ratio = ((float)(w-1))/w2 ; float y_ratio = ((float)(h-1))/h2 ; float x_diff, y_diff, blue, red, green ; for (int i=0;i<h2;i++) { for (int j=0;j<w2;j++) { x = (int)(x_ratio * j) ; y = (int)(y_ratio * i) ; x_diff = (x_ratio * j) - x ; y_diff = (y_ratio * i) - y ; index = (y*w+x) ; a = pixels[index] ; b = pixels[index+1] ; c = pixels[index+w] ; d = pixels[index+w+1] ; // blue element // Yb = Ab(1-w)(1-h) + Bb(w)(1-h) + Cb(h)(1-w) + Db(wh) blue = (a&0xff)*(1-x_diff)*(1-y_diff) + (b&0xff)*(x_diff)*(1-y_diff) + (c&0xff)*(y_diff)*(1-x_diff) + (d&0xff)*(x_diff*y_diff); // green element // Yg = Ag(1-w)(1-h) + Bg(w)(1-h) + Cg(h)(1-w) + Dg(wh) green = ((a>>8)&0xff)*(1-x_diff)*(1-y_diff) + ((b>>8)&0xff)*(x_diff)*(1-y_diff) + ((c>>8)&0xff)*(y_diff)*(1-x_diff) + ((d>>8)&0xff)*(x_diff*y_diff); // red element // Yr = Ar(1-w)(1-h) + Br(w)(1-h) + Cr(h)(1-w) + Dr(wh) red = ((a>>16)&0xff)*(1-x_diff)*(1-y_diff) + ((b>>16)&0xff)*(x_diff)*(1-y_diff) + ((c>>16)&0xff)*(y_diff)*(1-x_diff) + ((d>>16)&0xff)*(x_diff*y_diff); temp.push_back( ((((int)red)<<16)&0xff0000) | ((((int)green)<<8)&0xff00) | ((int)blue) | 0xff); // hardcode alpha ; } } return temp; }
我这样使用它:
vector<int> NewImage = resizeBilinear(IntData, image_width, image_height, window_width, window_height);
这是应该返回重新大小的图像的RGBA向量。 现在我正在改回RGBA(从int)
Image.clear(); for(unsigned i=0; i<NewImage.size(); i++) { Image.push_back(NewImage[i] & 255); Image.push_back((NewImage[i] >> 8) & 255); Image.push_back((NewImage[i] >> 16) & 255); Image.push_back(0xff); }
我得到的是一个黑色的窗口(默认的背景颜色),所以我不知道我错过了什么。 如果我注释掉我得到新图像的那一行,只是转换回RGBA的IntImage
我得到正确的值,所以我不知道这是搞砸的RGBA / int <> int / RGBA。 我现在失去了 我知道这可以优化/简化,但现在我只是想使其工作。
你的代码中的数组访问是不正确的:
vector<int> temp(w2 * h2); // initializes the array to contain zeros ... temp.push_back(...); // appends to the array, leaving the zeros unchanged
你应该覆盖,而不是追加; 为此,计算阵列位置:
temp[i * w2 + j] = ...;
或者,将数组初始化为空状态,并追加你的东西:
vector<int> temp; temp.reserve(w2 * h2); // reserves some memory; array is still empty ... temp.push_back(...); // appends to the array