You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Haskell Gloss库使用bitmapSection提取图片区域异常问题求助

问题原因

1. BMP文件加载方式错误

你直接通过ByteString.readFile读取的是完整的BMP文件内容,包含14字节文件头、40字节信息头,部分BMP还会附带调色板数据,并非纯像素序列。而bitmapDataOfByteString接口要求输入的是无额外元数据的原始像素数组,你现在把文件头数据当成像素解析,自然会出现色彩错乱、内容错位的问题。
Gloss自带的bitmapDataOfBMP接口会自动解析BMP文件头,提取正确的像素数据,不需要你手动处理字节串。

2. 额外注意:bitmapSection参数规则

Rectangle构造器的参数格式为Rectangle (左上角X坐标, 左上角Y坐标) (区块宽度, 区块高度),坐标原点为整张位图的左上角,Y轴向下为正,你测试用的Rectangle (0,0) (32,32)取全图的写法是符合规则的,后续提取瓦片时只要按照这个逻辑计算坐标即可。

修正代码示例

import Graphics.Gloss
import Graphics.Gloss.Interface.IO.Game
import qualified Data.ByteString as BS

main :: IO ()
main = do
    state <- loadPics
    playIO
        (InWindow "WindowName" (500,100) (10,10))
        white
        60
        state
        (return . id)
        (\_ state -> return state)
        (\_ state -> return state)

loadPics :: IO Picture
loadPics = do
    -- 正确加载BMP文件,自动处理头部信息
    bmpRaw <- BS.readFile "rechteck_gruen.bmp"
    let Right bitmapData = bitmapDataOfBMP bmpRaw
        -- 提取整张32x32图
        fullPic = bitmapSection (Rectangle (0,0) (32,32)) bitmapData
        -- 示例:提取左上角16x16的瓦片
        tilePic = bitmapSection (Rectangle (0,0) (16,16)) bitmapData
        -- 并列展示
        scene = [translate (-30) 0 fullPic, translate 30 0 tilePic]
    return $ pictures scene

内容的提问来源于stack exchange,提问作者Thomas Meyer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 02:48:02