سؤال

كما يقول أعلاه:كيف يمكنني استخدام مرافق تحميل الصور الخاصة بـ صورة SDL ملزمة لهاسكل لتحميل أ برنامج OpenGL الملمس، كما تفعل كثيرًا في لغة C.تدعم SDL-image مجموعة متنوعة من تنسيقات الصور، ولكنها توفر فقط ملف Surface نوع البيانات.ل glTexImage2D, يبدو أنني بحاجة إلى تقديم شيء مختلف، أ PixelData نوع البيانات.

هل هناك طريقة للحصول على بيانات الصورة دون اللجوء إلى لغة C؟حتى أنني سأستخدم بعض المكتبات الأخرى، طالما أنها توفر لي دعم PNG وJPG وTGA.

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

المحلول

لإنجاز هذا العمل مع استخدام أسطح SDL وروابط Haskell surfaceGetPixels يعود Pixels وهو نوع الاسم المستعار ل Ptr PixelData و PixelData هو إعلان بيانات فارغ.السبب في ذلك هو أن تنسيق البكسل لسطح SDL وعدد البتات لكل بكسل يمكن أن يكون أي شيء تقريبًا.لذا، إذا كان لديك تنسيق 32 بت في الثانية، فسوف تقوم بإلقاء المؤشر ليقول Ptr Word32 استخدام castPtr.

فيما يلي مثال للحصول على/وضع بكسل:

getPixel32 :: MonadIO m => Surface -> Int -> Int -> m Pixel
getPixel32 s x y = liftIO $ do
    ps <- surfaceGetPixels s
    assert (x >= 0 && x < surfaceGetWidth s && y >= 0 && y < surfaceGetHeight s) $
        Pixel `liftM` peekElemOff (castPtr ps :: Ptr Word32) offset
 where offset = y * (fromIntegral $ surfaceGetPitch s `div` 4) + x

setPixel32 :: MonadIO m => Surface -> Int -> Int -> Pixel -> m ()
setPixel32 s x y (Pixel pixel) = liftIO $ do
    ps <- surfaceGetPixels s
    assert (x >= 0 && x < surfaceGetWidth s && y >= 0 && y < surfaceGetHeight s) $
        pokeElemOff (castPtr ps :: Ptr Word32) offset pixel
 where offset = y * (fromIntegral $ surfaceGetPitch s `div` 4) + x

وبالمثل، يمكنك توجيه المؤشر إلى نوع مؤشر معين وإعطائه إلى glTexImage2D لتحميل النسيج.

نصائح أخرى

ربما Codec.Image.DevIL يوفر ما تبحث عنه؟اصدق ذلك يجب على أي حال.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top