2014-09-22 7 views
0

QImage에서 마스크를 사용하고 싶습니다. 마스크를 처리하려면 QBitmap이 필요합니다. 지금은이 일 할 수있는 빠른 방법을 찾고 있어요 : 마스크의QBitmap의 픽셀을 수정하는 방법

  1. 반전 비트를 빠른 방법으로는 새 값

에 마스크의

  • 설정 픽셀이
  • 이 작업을 수행? 또는 QPainter 개체를 사용하여 QBitmap을 수정할 수 있습니까?

    인사말

    답변

    1

    가장 좋은 QImage::Format_Mono로 설정 형식 QImage을 사용하는 것입니다. 이렇게하면 마스크로 사용할 수있는 픽셀 당 1 비트 이미지를 만들 수 있습니다.

    1. 픽셀을 반전하려면 invertPixels 메서드를 사용하십시오.
    2. QImage 비트는 bits 또는 scanLine 방법을 사용하여 액세스 할 수 있습니다.

    는 마스크로 QImage를 사용하려면, 당신은 QPixmap 처음으로 변환해야합니다 : QImage::Format_Mono 이후

    먼저 픽셀 MSB를 인코딩 (제 1 픽셀이 가장 중요한에 저장된다는 것을 의미합니다 함수의 리튬을 사용하지 않는, 물론

    int GetPixel(const QImage& img, const int x, const int y) const 
    { 
        const uchar mask = 0x80 >> (x % 8); 
        return img.scanLine(y)[x/8] & mask ? 1 : 0; 
    } 
    
    void SetPixel(QImage& img, const int x, const int y, const int pixel) 
    { 
        const uchar mask = 0x80 >> (x % 8); 
        if (pixel) 
         img.scanLine(y)[x/8] |= mask; 
        else 
         img.scanLine(y)[x/8] &= ~mask; 
    } 
    

    : 8 개 픽셀/바이트로 첫 번째 바이트)의 비트, 당신은 주어진 X/Y 위치에 대한 올바른 비트에 액세스하는 데 일부 비트의 마법이 필요합니다 예 : scanLine(y) 각 픽셀에 대해 조회하지 않으려는 경우 동일한 행에서 많은 픽셀을 조작 할 때 SetPixel을 사용하십시오. 창의력을 발휘하십시오!

    +0

    감사합니다. 나는이 아이디어도 가지고 있었다. 하지만 QImage를 매번 QBitmap으로 변환하여 마스크로 사용해야합니다. 또는 Qimage를 마스크로 사용하려면 어떻게해야합니까? (시간에 나는 마스크를 셋업하기 위해'QPainter'의'setClipRegion()'메서드를 사용했다.) –

    +1

    'setMask' 또한 값 비싼 연산이다. 왜냐하면'QBitmap'은 여전히 ​​장치 의존적으로 변환 될 필요가 있기 때문이다. 'QPixmap'. 마스크가 바뀌면'QPixmap' 마스크 만 업데이트하는 것이 더 낫습니다 (각 페인트마다 마스크를 변경하지 않는 한). 화가의 [컴포지션 모드] (http://qt-project.org/doc/qt-5/qpainter.html#composition-modes) 중 하나를 사용할 수 있습니다 (OpenGL에서 작동하지 않는 것 같습니다). 화가 그래도) –

    +0

    '작곡 모드'나를 도와줍니다. 현재'QImage'의'setPixel' 메소드를 사용하고 있습니다 만, 많은 수의 픽셀을 수정하고 싶다면 비트 연산이 더 빠르다고 생각합니다. 문제는'bits()'만이'uchar'을 가진 포인터를 반환한다는 것입니다. 픽셀 x의 값을 설정하는 방법을 말해 줄 수 있습니까? –