【问题标题】:Changing <QBitmap> / <QImage>'s contrast改变 <QBitmap> / <QImage> 的对比度
【发布时间】:2020-12-03 16:03:34
【问题描述】:

我使用了一个示例代码(来源: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) 仅将其颜色更改为更“灰色”,并且当“因子”增加其值时它变为 100% 灰色。 “因子”变量越多,图像的“灰度”就越多,看起来我实际上并没有改变对比度。

【问题讨论】:

    标签: c++ c++11 bitmap qt5 image-editing


    【解决方案1】:

    我只需将因子变量从 ~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 ;  
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-04-13
      • 1970-01-01
      • 2011-01-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多