2011-03-17 1 views
0

QImage에서 표시하려고하는 이미지가 있습니다. 내 데이터 버퍼는 "행 높이"이고 "COLS * 3 폭"입니다,이 데이터 버퍼를 QImage에 표시하는 방법

rgbMapped[row][col * 3] = red; 

    rgbMapped[row][col * 3 + 1] = green; 

    rgbMapped[row][col * 3 + 2] = blue; 

당신이 볼 수 있듯이 :

*이 COLS 이미지 행을 채 웁니다 코드의 조각이다

rgbMapped는 부호없는 char ** 배열입니다. 그래서 나의 QT 코드에서 나는 다음과 같습니다

QImage *qi = new QImage(getWidth(), getHeight(), QImage::Format_RGB888); 

for (int h = 0; h< getHeight(); h++){ 
    memcpy(qi->scanLine(h), rgbMapped[h], getWidth()*3); 
} 
QPixmap p(QPixmap::fromImage(*qi,Qt::ColorOnly)); 

if(scene.items().contains(item)){ 
    scene.removeItem(item); 
} 
item = new ImagePixmapItem(p); 
scene.addItem(item); 
ui->graphicsView->setScene(&scene); 
ui->graphicsView->show(); 

ImagePixMapItem 내가 나에게 몇 가지 마우스 이벤트를 가로 챌 수 있도록 작성한 QGraphicsPixmapItem,하지만 난 페인트 기능 또는 아무것도의와 anyhting을 dindt.

이 코드를 실행하면 내 이미지가 내 이미지처럼 보입니다. 단 3 개의 사본, 녹색 색조가있는 이미지, 노란색 틱이있는 이미지, 자주색 색조가있는 이미지가 있습니다.

이 세 가지 데이터가 서로 오버레이 된 경우 정확한 이미지가 될 것 같습니다.

+0

- 테스트 케이스를 간소화하고 파일 대신 이미지를 저장하거나 QPainter를 사용하여 직접 페인트하려고합니다. 그냥 QImage-QPixmap 변환이나 그래픽보기에 문제가 없는지 확인하십시오. - 내 첫 번째 추측은 어떻게 든 행과 열이 어긋나게되는 것입니다. –

+0

3 장으로 동일한 이미지가 가로 또는 세로로 동일한 크기의 이미지에 3 개 찍혔다는 것을 의미합니까? 아니면 그 결과가 너비 또는 높이의 3 배가 될까요? –

+0

그것이 예정되어 있었던 폭의 3 배이었다. getHeight() 및 getWidth()가 배열의 치수를 반환했기 때문에 그 부분이있을 수 있다고 생각합니다. 대신 이미지의 크기가되어야합니까? – Derek

답변

1

당신이 언급 한 (잘못된) 색상으로부터 가정하면, char **rgbMapped 변수에 관한 할당/초기화 코드에 문제가있을 수 있습니다. 이 코드를 게시 해주십시오.

나는 올바른 (?) 초기화 코드 을 작성하여 (코드를 컴파일하지 않아서 구문 오류가 생겨 사과 할 수 있습니다.) 도움을 줄 것입니다. malloc()을 사용하지만 new() 연산자를 사용할 수도 있습니다.

// allocate a single buffer for all image pixels 
unsigned char *imgbuf = malloc(3 * getWidth() * getHeight()); 

// allocate row pointers 
unsigned char **rgbMapped = malloc(getHeight() * sizeof (unsigned char *)); 

// Initialize row pointers 
for (int h=0; h < getHeight(); h++) 
{ 
    *rgbMapped[h] = &imgbuf[h * 3 * getWidth()]; 
} 

// ... do your processing 

// Free the image buffer & row pointers 
free(imgbuf); 
imgbuf = NULL; 
free(rgbMapped); 
rgbMapped = NULL; 

중요한 부분은 행 포인터 초기화입니다 (* 3을 잊었습니까?). 그냥 2c입니다.

+0

나는이 방법을 좋아한다. 대괄호 표기법을 사용하여 액세스 할 수있는 인접한 메모리 블록을 얻을 수 있습니다.+1 – Derek

+0

그냥 혼란을 피하기 위해 : 위의 코드 샘플에서는 getHeight(), getWidth()는 실제 이미지 높이와 너비 - 필요한 char 배열의 너비가 아니라고 가정합니다. 또 다른 접근법은 모든 행 포인터에 단일 메모리 블록을 할당하는 것입니다. 그러나 느려지 며 일부 시스템에서는 메모리 조각화 상황에 더 취약합니다. –

0

스트라이드를 고려하고 계십니까? 각 주사선은 4 바이트 경계에서 시작해야합니다. 또한 압축 된 픽셀 형식이 아니기 때문에 각 픽셀은 3 바이트가 아닌 4 바이트입니다.

+0

스캔 라인이 4 바이트 경계에 있어야한다는 것을 알지 못했습니다. – Derek

+0

여기에는 문제가 없습니다. 그는 QImage가 메모리를 할당하고 그것으로부터 스캔 라인 버퍼를 사용하게했다. 스트라이드 요구 사항은 QImage 코드로 처리됩니다. –

관련 문제