2011-12-03 3 views
0

래스터 그래픽 편집 응용 프로그램을 개발 중입니다. 이 응용 프로그램에서는 QImage 클래스의 scanline 함수와 동일한 작업을 수행 할 scanline 함수를 만들어야합니다. 그러나 나는 주사선 기능이 작동하는 방식과 일반적으로 주사선을 사용하는 방식과 다소 혼동을 느낍니다. 예를 들어, 높이가 177px 인 이미지에 대해 bytesPerLine()을 호출하면 해당 값이 531 (각 픽셀 당 3 바이트)이지만이 함수는 520을 반환 할 것으로 기대하고 있었습니까? 또한qimage 클래스의 scanline 함수

, I는 가변 데이터 (249) R = G = B = 249 249 값 uchar data = image->scanLine(y)[x] 를 사용하여 255 I 가 실제로이 값을 이해하지 못하고있다. 미리 감사드립니다.

+0

저는 각 픽셀이 RGBA 인 4 바이트가 될 것으로 기대합니다. 255는 아마도 알파 채널입니다. 다음 2 바이트를 확인하십시오. –

+0

후속으로,'QImage'가 어떤 형식으로 구성되었는지 알고 있습니까? 이것은 주어진 픽셀의 크기와 바이트의 크기에 직접적인 영향을 미친다. 문서의 내용 : > 32 비트 이미지 데이터에 액세스하는 경우 반환 된 포인터를 QRgb *로 캐스팅하고 (QRgb는 32 비트 크기 임) 픽셀 값을 읽거나 쓸 때 사용합니다. 픽셀 형식은 기본 플랫폼의 바이트 순서에 따라 다르기 때문에 uchar * 포인터를 직접 사용할 수 없습니다. qRed(), qGreen(), qBlue() 및 qAlpha()를 사용하여 픽셀에 액세스하십시오. –

+0

@EvanTeran : QImage는 Format_RGB32 형식으로 생성되었습니다. 나는 qRgb에 포인터를 반환해야한다고 생각하지만 캐스팅하지 않고 색상에 액세스하는 데 관심이 있습니다. image-> scanLine (y) [x]에 의해 반환 된 값에서 어떤 색상 값에 액세스했는지 이해할 수 없습니다. – Mirzet

답변

1

신뢰할 수있는 동작을 위해 QImage::format()의 반환 값을 확인하여 원본 이미지 데이터에 액세스하기 전에 어떤 기본 형식이 사용되는지 확인해야합니다.

Qt는 (RGB32 형식이 단순히 0xff 가득 것) 알파 채널이 존재 여부, 각 픽셀은 4 바이트 소요 트루 색상 RGB32/ARGB32 형식을 선호하는 것으로 보인다. 트루 컬러 이미지를로드하는 경우이 두 가지 형식 중 하나 일 가능성이 큽니다.

게다가 플랫폼마다 바이트 순서가 다를 수 있으므로 가능한 경우 언제든지 QRgb을 사용하여 32 비트 픽셀에 액세스하십시오.

사실, 스캔 라인이 수평이되어서는 안됩니까? scanline의 길이를 계산하려면 height() 대신 width()을 사용해야한다고 생각합니다.