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
相关产品推荐
相关产品推荐

