سؤال

أقوم ببناء تطبيق QT واجهة المستخدم الرسومية وأستخدم Qimage لفتح الصور. مشكلتي هي أنه لا يمكنني معرفة كيفية استخدام طرق Qimage's Bit () و Scanline () للوصول إلى مستوى بكسل.

لقد رأيت هذا المنشور Qt Qimage Pixel مشاكل التلاعبولكن هذا فقط للبكسل الأول من كل صف. هل هذا صحيح أم أنني أخطأت؟

شكرا لك مقدما

هل كانت مفيدة؟

المحلول

ال scanlines تتوافق مع ارتفاع الصورة ، وتتوافق الأعمدة مع عرض الصورة.

وفقًا للمستندات ، يبدو النموذج الأولي uchar* QImage::scanline(int i), ، أو مماثلة const الإصدار.

ولكن ، كما أشار المعلق ، لأن البيانات تعتمد على بنية الجهاز وصورة ليس استخدم ال uchar * مباشرة. بدلاً من ذلك ، استخدم شيئًا مثل ما يلي:

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

نصائح أخرى

قد لا يكون الأمر واضحًا على الفور من منشور Kaleb ، ولكن ما يلي يعمل على تعيين بكسل على صورة 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));

الجواب لم ينجح لي. يبدو أن البيانات ليست محاذاة 32 بت على نظامي. للحصول على البيانات الصحيحة ، على نظامي ، كان علي القيام بذلك:

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);
    }
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top