Pergunta

Estou construindo um aplicativo QT GUI e uso QIMAGE para abrir imagens. Meu problema é que não consigo descobrir como usar os métodos Bit () e ScanLine () para obter acesso no nível de pixels.

Eu vi este post Qt qimage pixels de manipulaçãoMas isso é apenas para o primeiro pixel de cada linha. Isso está correto ou entendi tudo errado?

desde já, obrigado

Foi útil?

Solução

o scanlines correspondem à altura da imagem, as colunas correspondem à largura da imagem.

De acordo com os documentos, o protótipo se parece uchar* QImage::scanline(int i), ou um semelhante const versão.

Mas, como um comentarista apontou, porque os dados dependem da arquitetura e imagem da máquina, você deve NÃO use o uchar * diretamente. Em vez disso, use algo como o seguinte:

QRgb *rowData = (QRgb*)img.scanLine(row);
QRgb pixelData = rowData[col];
int red = qRed(pixelData);

Outras dicas

Pode não ser imediatamente óbvio na postagem de Kaleb, mas o seguinte funciona para definir um pixel em uma imagem format_rgb32.

// Get the line we want
QRgb *line = (QRgb *)image->scanLine(row_index);

// Go to the pixel we want
line += col_index;

// Actually set the pixel
*line = qRgb(qRed(color), qGreen(color), qBlue(color));

A resposta não funcionou para mim. Parece que os dados não estão alinhados com 32 bits no meu sistema. Para obter os dados corretos, no meu sistema, tive que fazer isso:

for(uint32_t Y = 0; Y < mHeight; ++Y)
{
    uint8_t* pPixel = Image.scanLine(Y);

    for(uint32_t X = 0; X < mWidth; ++X)
    {
      const int Blue = *pPixel++;
      const int Green = *pPixel++;
      const int Red = *pPixel++;

      uint8_t GrayscalePixel = (0.21f * Red) + (0.72f * Green) + (0.07 * Blue);
    }
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top