改变 <QBitmap> / <QImage> 的对比度

Changing <QBitmap> / <QImage>'s contrast

我使用了一个示例代码(来源:https://forum.qt.io/topic/11390/increasing-contrast-of-qimage/4)来改变 QImage 的对比度(我也对其进行了一些编辑):

    void SetBetween0and255(double& value)
    {
        if(value > 255)
            value = 255;
        if(value < 0)
            value = 0;
    }
    void CreateHistogram(QMap<QRgb,long>& histo, QImage& image)
    {
        QRgb c = 0;
        int l, k;
        histo.clear();
        for(k = 0; k < image.width(); ++k)
            for( l = 0; l < image.height(); ++l) {
                c = image.pixel(k,l);
                if(!histo.contains(c))
                    histo.insert(c,0);
            }
        //computation of occurences
        for( k = 0; k < image.width(); ++k)
            for( l = 0; l < image.height(); ++l) {
                c = image.pixel(k,l);
                histo[c] = histo[c]+1;
            }
    }
    
    void ImageViewer::ChangeContrast()
    {
        newImage = image.copy();
        QMap<QRgb,long> histo; // histogram map
        CreateHistogram(histo, newImage);
        //compute average value
        long sum_1 = 0, sum_2 = 0;
        QMap<QRgb,long>::iterator j;
        for(j = histo.begin();j!=histo.end();j++) {
            sum_1+=j.value()*j.key();
        }
        for(j = histo.begin();j!=histo.end();j++) {
            sum_2+=j.value();
        }
        long av = sum_1/sum_2;
        //changing contrast of an newImage by factor getted from horizontal slider ui:
        double factor = (double)( (double)sliderBar->value() )/100 ;    // to change also
    
        QRgb c = 0;
        int l, k, r = qRed(av), g = qGreen(av), b = qBlue(av);
        if(factor!=1)
        for (l = 0; l < newImage.height(); ++l) {
            for (k = 0; k < newImage.width(); ++k) {
                c = QRgb(newImage.pixel(k,l));
                QColor col(c);
                col.getRgb(&r,&g,&b);
                double r_n = r / 255.0;
                r_n -= 0.5; r_n *= factor;
                r_n += 0.5; r_n *= 255;
                double g_n = g / 255.0;
                g_n -= 0.5; g_n *= factor;
                g_n += 0.5; g_n *= 255;
                double b_n = b / 255.0;
                b_n -= 0.5; b_n *= factor;
                b_n += 0.5; b_n *= 255;
                SetBetween0and255(r_n);
                SetBetween0and255(g_n);
                SetBetween0and255(b_n);
                newImage.setPixel(k,l,qRgb((int)r_n,(int)g_n,(int)b_n));
            }
        }
        setImage(newImage);
    }

但是感觉下面几行代码有问题:

        r_n -= 0.5; r_n *= factor;
        r_n += 0.5; r_n *= 255;
        double g_n = g / 255.0;
        g_n -= 0.5; g_n *= factor;
        g_n += 0.5; g_n *= 255;
        double b_n = b / 255.0;
        b_n -= 0.5; b_n *= factor;
        b_n += 0.5; b_n *= 255;

有什么我可以在这里更正以更改图像的实际对比度吗?因为现在发生的事情是生成的图像 (newImage) 仅将其颜色更改为更“灰色”,并且当“factor”增加其值时它变为 100% 灰色。 “factor”变量越多,图像的“灰度”越多,看起来不像我真的在改变对比度。

我只需将因子变量从 ~1 设置为 ~30 即可通过将这些值提供给函数来更改对比度,而 QSlider 返回了不正确的值。

也可以通过传递 -1 到 -30 之间的值来反转图像颜色,同时更改反转图像的对比度。

所以正确的代码如下:

// creating QSpinBox instead of QSlider and doing stuff 
//...
QSpinBox *qSpinBox = new QSpinBox(this);
int height = 100, int width = 10;
QSpinBox->move(width, height); ( move it manually somewhere to see the spinbox widget clear ) 
//...
//from 1 to 30 || from -1 to -30
double factor = (double)( (double)qSpinBox->value() )/100 ;