2011-12-03 21 views
0

私はラスターグラフィックを編集するためのアプリケーションを開発しています。このアプリケーションでは、QImageクラスのscanline関数と同じことをするscanline関数を作成する必要があります。 しかし、私は、スキャンライン機能が動作する方法とスキャンラインを一般的に混乱させることはほとんどありません。 たとえば、高さが177pxの画像に対してbytesPerLine()を呼び出すと、その値は531(各ピクセルの3バイト)になりますが、この関数は520を返します。またqimageクラスのscanline関数

、私は変数データでR = 249、G = 249、B = 249の値について uchar data = image->scanLine(y)[x] を使用する255 は、私は本当にこの価値を理解していないです。 ありがとうございます。

+0

私は各ピクセルがRGBAであると予想します.255はおそらくアルファチャンネルです。次の2バイトを確認してください。 –

+0

フォローアップ、 'QImage'がどのようなフォーマットで構築されたか知っていますか?これは、与えられたピクセルのバイトとフォーマットのサイズに直接影響します。ドキュメント: > 32-bppイメージデータにアクセスする場合は、返されたポインタを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形式を好むようです。トゥルーカラーのイメージを読み込むと、おそらくこれらの2つのフォーマットのいずれかになります。

さらに、プラットフォーム間でバイト順が異なる可能性がある場合は、QRgbを使用して32ビットピクセルにアクセスしてください。

ところで、スキャンラインを水平にしないでください。私はheight()の代わりにwidth()を使ってスキャンラインの長さを計算するべきだと思います。