Russian Qt Forum

Qt => Мультимедиа => Тема начата: TukiNov от Март 12, 2009, 16:54



Название: Обратить нужный цвет в альфа канал.
Отправлено: TukiNov от Март 12, 2009, 16:54
Приветствую всех :)
Такая задачка :) есть изображение RGB, в нем доминирует цвет RGB(200, 204, 200). Нужно его обратить в альфа канал.
У меня идея такая, пробежаться по пикселам, вытащить цвет каждого пиксела, и если цвета совпадают, обратить этот цвет в альфа канал. Вот только что то я встрял на этом :)
Код:
QImage fragment( "test.png" );
    int w = fragment.width();
    int h = fragment.height();
    for( int x = 0; x < w; ++x )
      for( int y = 0; y < h; ++y ){
        QRgb rgb = fragment.pixel( x, y );
        int red = qRed( rgb );
        int green = qGreen( rgb );
        int blue = qBlue( rgb );
        QColor color( red, green, blue );
        if( red == 200 && green == 204 && blue == 200 ){
          color.setAlpha( 100 );
        }
      }
а как дальше понятия не имею :) Может есть другой способ ? :)
Заранее спасибо :)


Название: Re: Обратить нужный цвет в альфа канал.
Отправлено: lit-uriy от Март 12, 2009, 18:12
посмотри:
QImage QImage::createMaskFromColor ( QRgb color, Qt::MaskMode mode = Qt::MaskInColor ) const
QImage QImage::createAlphaMask ( Qt::ImageConversionFlags flags = Qt::AutoColor ) const


Название: Re: Обратить нужный цвет в альфа канал.
Отправлено: TukiNov от Март 13, 2009, 10:27
не пашет. Назначение первой функции в обще не понятно. А вторая функция работает только с ARGB.


Название: Re: Обратить нужный цвет в альфа канал.
Отправлено: TukiNov от Март 13, 2009, 11:04
Усё, проблема решена :
Код:
QImage fragment( exampleObject->size(), QImage::Format_ARGB32 );
    fragment = exampleObject->copy( 30, 277, 110, 102 );

    QPixmap alphaPixmap( QSize( fragment.size() ) );
    alphaPixmap.fill( QColor( 200, 204, 200 ) );

    QPixmap fragmentAlpha( fragment );
    fragmentAlpha.setAlphaChannel( alphaPixmap );
    fragmentAlpha.save( "alfa.png", "PNG", -1 );


Название: Re: Обратить нужный цвет в альфа канал.
Отправлено: TukiNov от Март 16, 2009, 20:15
Обшибся :) код выше делает все изображение полупрозрачным. След код устраняет этот недостаток :)
Код:
QImage fragment( exampleObject->size(), QImage::Format_ARGB32 );
    fragment = exampleObject->copy( 30, 277, 110, 102 );

    //Подключаем альфа канал
    QPixmap alpha( QSize( fragment.size() ) );
    alpha.fill( QColor( 255,255,255 ) );
    fragment.setAlphaChannel( alpha );

    int w = fragment.width();
    int h = fragment.height();
    for( int y = 0; y < h; ++y )
      for( int x = 0; x < w; ++x ){
        QRgb rgb = fragment.pixel( x, y );
        int red = qRed( rgb );
        int green = qGreen( rgb );
        int blue = qBlue( rgb );
        //в if прописываем цвет фона
        if( red == 200 && green == 204 && blue == 200 ){
          fragment.setPixel( x, y, qRgba( 255, 255, 255, 0 ) );
        } else {
          fragment.setPixel( x, y, qRgba( red, green, blue, 255 ) );
        }
      }


Название: Re: Обратить нужный цвет в альфа канал.
Отправлено: Xopxe от Октябрь 01, 2010, 23:39
lit-uriy, спасибо работает.
Для тех кто в танке

Код:
QPixmap alfaPixmap;
alfaPixmap=Pixmap->createMaskFromColor(QColor(0,255,255),Qt::MaskOutColor);
Pixmap->setAlphaChannel(alfaPixmap);