魔兽地图编辑器吧 关注:65,035贴子:3,836,355
  • 13回复贴,共1

求问如何动态修改图像的内容

只看楼主收藏回复

一般创建一个图像,是导入 xxx.blp 到输入管理器,然后 CreateImage 使用 xxx.blp,显示图像
我想在游戏中本地写一个 blp 文件,然后调用 CreateImage 显示我新写的图片,但是似乎不行,只有事先在输入管理器内准备好的才可以
有没有什么办法,能游戏中往输入管理器里放文件,或者修改其中已有的文件内容?


IP属地:浙江1楼2022-11-26 11:18回复
    阔以做到 不过需要c++ 和 return bug


    IP属地:浙江来自Android客户端2楼2022-11-26 11:58
    回复
      用lua
      require 'jass.storm'
      storm.save(路径, 内容) 储存
      storm.load(路径) 读取


      IP属地:北京3楼2022-11-27 14:38
      收起回复
        研究了几天,搞懂了BLP的格式
        BLP有BLP1和BLP2,魔兽只支持BLP1
        BLP1又分JEPG和Direct,其中JEPG似乎是非线性的,我也没看懂。Direct比较简单,我只搞懂了Direct
        我在 HIVE 找到了转换器 BLP Lab,它显示的数据可以帮助分析格式

        用这个软件生成一个无压缩的BLP1,方便研究

        Mipmap似乎是几种不同的缩放倍数选择,我没弄懂,只设置了最简单的1层


        IP属地:浙江4楼2022-12-05 23:51
        回复
          一张图片是一个超大的字符串,每个字符是1个字节,也就是8比特(uint8)。4个字节为32比特(uint32)
          以 128x128 的BLP1图片为例,MipMap为1,我们从头排序,格式是这样的:
          uint32 : BLP1 (固定是这4个字符)
          uint32 : 1 (0=JEPG;1=Direct。只会Direct所以选1)
          uint32 : 8 (alphaBits,意思是透明度用几个比特表示,这里用1个字节)
          uint32 : width (图像宽度)
          uint32 : height (图像高度)
          uint32 : 4(不知道是什么,按照模板来)
          uint32 : 1(不知道是什么,按照模板来,也许是MipMap数量?)
          uint32 : MipMap.offset[16] (MipMap的1~16层的起始数据偏移,因为只用1层,所以只有1用得上,其他与1一样或者为0)
          uint32 : MipMap.size[16] (MipMap的1~16层的数据字节数,因为只用1层,所以只有1用得上,其他与1一样或者为0)
          uint8 : palette[256*4](这里开始以字节uint8为单位了。调色板,BLP为256色,意思是调色板上准备好了至多256种颜色可以选,每种颜色RGBA共4个字节,所以是256*4)
          uint8 : data[128*128] (数据,大小为width * height。每个数据范围为0~255,意思是指向调色板的第几个颜色)
          uint8 : alpha[128*128] (透明度,大小为width * height。每个数据范围为0~255,意思是这一像素的透明度)
          在data部分中,可以发现每个像素只有1个比特大小,而非4个比特(RGBA共4个)。因为data并不是表示这个点的颜色,而是指向调色板的某个序号的颜色,也就是索引。多个数据可以指向同一个调色板的颜色,也因此最多只能有256种颜色,因为调色板就这么大
          调色板的RGBA中,A是无效的,真正有效的透明度是最后的alpha部分,每个像素有独立的透明度
          MipMap.offset(数据偏移) 的算法:
          BLP1(4个字节)
          Direct(4个字节)
          alphaBits(4个字节)
          width(4个字节)
          height(4个字节)
          4(4个字节)
          1(4个字节)
          Mipmap.offset[16] (4*16 = 64个字节)
          Mipmap.size[16] (4*16 = 64个字节)
          palette[256*4] (256*4 = 1024个字节)
          接下来才是数据部分,所以数据的偏移 offset = 4+4+4+4+4+4+4 + 64 + 64 + 1024 = 39 * 4 + 1024 = 1180
          (注意,从0开始数,所以不用+1)
          因此,MipMap.offset 填 1180
          size 为 数据+透明度的长度,所以是 128 * 128 * 2


          IP属地:浙江5楼2022-12-06 00:08
          回复
            关于调色板,我看了一下 BLP LAB 生成的图片,似乎是有N个颜色就填充N个颜色,后面N+1 ~ 256 都填0
            但是我不知道超出了256种颜色该怎么处理
            我的处理方法是,按 256色划分,一共填 216(6*6*6)种颜色,之后数据判断一下跟哪种颜色比较接近,就失真一点点,往哪个颜色靠
            代码拜读了 vscode 上 hugehardzhang 大佬做的插件 blp-preview
            github上是:
            https://github.com/ilimei/vscode-plugin-blp-preview/blob/main/media/binReader.js
            其中似乎也有讲 JEPG 的计算方法,不过有点复杂,还没弄懂


            IP属地:浙江6楼2022-12-06 00:17
            回复
              github 搜索 vscode-plugin-blp-preview 也能找到


              IP属地:浙江7楼2022-12-06 00:18
              回复
                最后使用lua
                local storm = require 'jass.storm'
                用 storm.save 就可以写文件,然后 CreateImage 创建图像
                最终成品是这样,左边是模板,右边是我写的256色,可以看到有一些失真,不过还说得过去


                IP属地:浙江8楼2022-12-06 00:22
                回复
                  特别感谢 @金皮凤凰蛋
                  本来暴雪停服的事情就搞得我很难受,跟癌症晚期一样,钻研 war3 受到一点打击。在贴吧提问了一下,想不到竟然有人帮助,最终我也是搞出了BLP造数据,还是挺开心的
                  贴吧似乎没多少BLP1格式的讨论,所以分享一下我的心得


                  IP属地:浙江9楼2022-12-06 00:27
                  收起回复
                    https://tieba.baidu.com/p/6843931106


                    IP属地:上海10楼2022-12-06 15:37
                    收起回复