2010-01-19 35 views
11

Tôi đang xây dựng ứng dụng QT GUI và sử dụng QImage để mở ảnh. Vấn đề của tôi là tôi không thể tìm ra cách sử dụng các phương thức bit() và scanline() của QImage để truy cập ở mức pixel.Thao tác trên pixel QImage QT

Tôi đã xem bài đăng này Qt QImage pixel manipulation problems nhưng điều này chỉ dành cho pixel đầu tiên của mỗi hàng. Điều này đúng hay tôi đã hiểu sai?

cảm ơn trước

+0

oopps !! lấy làm tiếc! sau khi đăng câu hỏi Tôi tìm thấy nó tại các diễn đàn QT http://qt.nokia.com/doc/qq/qq17-imageio.html và câu trả lời là: cho (quint32 y = 0; y theosem

Trả lời

13

Các scanlines tương ứng với chiều cao của hình ảnh, các cột tương ứng với chiều rộng của hình ảnh.

Theo tài liệu, nguyên mẫu trông giống như uchar* QImage::scanline(int i) hoặc phiên bản const tương tự.

Tuy nhiên, như một người bình luận đã chỉ ra, vì dữ liệu phụ thuộc vào kiến ​​trúc và hình ảnh máy, bạn nên NOT sử dụng trực tiếp uchar *. Thay vào đó, sử dụng một cái gì đó như sau:

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

-1: Chú ý! Vì câu trả lời này xuất hiện trong Google-search ngay cả trước khi tài liệu Qt-API chính thức, tôi nghĩ một lời cảnh báo là phù hợp. Bạn KHÔNG THỂ sử dụng [hàng] [col] để truy cập dữ liệu pixel, vì [col] sẽ chọn một dữ liệu điểm ảnh và dữ liệu pixel rất phụ thuộc vào định dạng bit-per-pixel. Vui lòng xem cảnh báo trong docu chính thức "Bạn không thể trực tiếp sử dụng con trỏ uchar *, vì định dạng pixel phụ thuộc vào thứ tự byte trên nền tảng cơ bản. Sử dụng qRed(), qGreen(), qBlue() và qAlpha() để truy cập các pixel. " http://qt-project.org/doc/qt-4.8/qimage.html#scanLine –

+1

Tôi đã cập nhật câu trả lời để phản ánh đúng cách để truy cập vào nó. –

12

Nó có thể không ngay lập tức rõ ràng từ bài Kaleb, nhưng các công trình sau đây để thiết lập một điểm ảnh trên một hình ảnh 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)); 
0

Câu trả lời không phù hợp với tôi. Có vẻ như, dữ liệu không phải là 32bit được căn chỉnh trên hệ thống của tôi. Để có được dữ liệu chính xác, trên hệ thống của tôi, tôi phải làm điều này:

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); 
    } 
}