C++ 如何修改双线性过滤RGBA图像大小调整功能以接受RGB输入?

C++ 如何修改双线性过滤RGBA图像大小调整功能以接受RGB输入?,c++,c,C++,C,我使用以下函数通过双线性过滤调整RGBA图像的大小: int a, b, c, d, x, y, index ; float x_diff, y_diff, blue, red, green ; int offset = 0; float x_ratio = ((float)(w1-1))/w2 ; float y_ratio = ((float)(h1-1))/h2 ; for (int i=0;i<h2;i++) { fo

我使用以下函数通过双线性过滤调整RGBA图像的大小:

 int a, b, c, d, x, y, index ;

    float x_diff, y_diff, blue, red, green ;
    int offset = 0;
    float x_ratio = ((float)(w1-1))/w2 ;
    float y_ratio = ((float)(h1-1))/h2 ;


    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*w1+x);  


            a = input_pixels[index] ;
            b = input_pixels[index+1] ;
            c = input_pixels[index+w1] ;
            d = input_pixels[index+w1+1] ;

            // blue element
            // Yb = Ab(1-w1)(1-h1) + Bb(w1)(1-h1) + Cb(h1)(1-w1) + 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-w1)(1-h1) + Bg(w1)(1-h1) + Cg(h1)(1-w1) + 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-w1)(1-h1) + Br(w1)(1-h1) + Cr(h1)(1-w1) + 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);

            output_pixels[offset++] = 
                    ((((int)red)<<16)&0xff0000) |
                    ((((int)green)<<8)&0xff00) |
                    ((int)blue) |
                    0xff000000;
        }
    }
inta,b,c,d,x,y,index;
浮动x_diff、y_diff、蓝色、红色、绿色;
整数偏移=0;
浮动x_比率=((浮动)(w1-1))/w2;
浮动y_比率=((浮动)(h1-1))/h2;
对于(int i=0;i8)&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);
//红色元素
//Yr=Ar(1-w1)(1-h1)+Br(w1)(1-h1)+Cr(h1)(1-w1)+Dr(wh)
红色=((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);
输出_像素[偏移量++]=

(((int)红色)类似于
unsigned int get_rgb(const void*data,unsigned index){const uint8_t*rgb=(const uint8_t*)data+3*index;返回(rgb[0]@IanAbbott-谢谢…这达到了我需要的位置,尽管为了我的目的我不得不更改顺序或返回的像素。太棒了,谢谢你。如果你写下你的评论,我会将其标记为回答。因为你使用的是8位rgb像素值,它们可能会被伽马(查找sRGB)修改。请记住,调整大小时,最好先将它们转换为线性空间。调整大小后,可以将它们转换回线性空间。