Esempio n. 1
0
        //SFFV2 从索引获取图像数据
        public byte[] getSprDataV2(int index, out byte[] pp, FI_FORMAT type, bool loadPal = true)
        {
            byte[]   sprData;
            byte[]   palData = null;
            int      sprSize;
            IntPtr   dib;
            sprMsgV2 spr = getSprMsgV2(index);

            if (spr.dataLen == 0)
            {
                //链接型图像
                return(getSprDataV2(spr.linkIndex, out pp, type));
            }
            seek((spr.flags == 1 ? msgV2.tdataOffset : msgV2.ldataOffset) + spr.dataOffset);

            //压缩算法(fmt)常量声明这里省略了,直接使用值
            //0 无压缩
            //2 Rle8压缩
            //3 Rle5压缩 几乎不会用到 直接省略
            //4 Lz5压缩
            //10 PNG8
            //11 PNG24
            //12 PNG32
            if (spr.fmt == 0)
            {
                sprData = br.ReadBytes(spr.dataLen);
            }
            else
            {
                sprSize = br.ReadInt32();                //解压后的校验长度,这里省略了校验
                sprData = br.ReadBytes(spr.dataLen - 4);
            }
            switch (spr.fmt)
            {
            case 0:
                if (loadPal)
                {
                    palData = getPalData(spr.palIndex);
                }
                pp = palData;
                break;

            case 2:
                sprData = sffV2Decompress.unRle8(sprData);
                if (loadPal)
                {
                    palData = getPalData(spr.palIndex);
                }
                pp = palData;
                break;

            case 4:
                sprData = sffV2Decompress.unLz5(sprData);
                if (loadPal)
                {
                    palData = getPalData(spr.palIndex);
                }
                pp = palData;
                break;

            case 10:
                //压缩算法为PNG算法时读取的数据默认都是一个完整的PNG文件 可以直接载入
                palData = getPalData(spr.palIndex);
                dib     = FI.LoadFromMemory(sprData, FI_FORMAT.FIF_PNG);
                //PNG8调色板校正
                RGBQUAD *pale = FI.GetPalette(dib);
                for (int n = 0; n < 256; n++)
                {
                    pale [n].Red   = palData [n * 4];
                    pale [n].Green = palData [n * 4 + 1];
                    pale [n].Blue  = palData [n * 4 + 2];
                }
                FI.SaveToMemory(dib, ref sprData, type);
                pp = palData;
                return(sprData);

            case 11:
            case 12:
                pp = null;
                return(sprData);

            default:
                sprData = new byte[0];
                pp      = new byte[0];
                return(sprData);
            }

            if (type != FI_FORMAT.FIF_UNKNOWN)
            {
                //对于无压缩、Rle8和Lz5压缩的图像读取的数据是原始的像素数据 不能直接载入
                dib = FI.ConvertFromRawBits(sprData, spr.width, spr.height, spr.width, 8, 0, 0, 0, true);
                RGBQUAD *pal      = FI.GetPalette(dib);
                int      colorNum = palData.Length / 4;
                for (int n = 0; n < colorNum; n++)
                {
                    pal [n].Red   = palData [n * 4];
                    pal [n].Green = palData [n * 4 + 1];
                    pal [n].Blue  = palData [n * 4 + 2];
                }
                FI.SaveToMemory(dib, ref sprData, type);
                FI.Free(dib);
                return(sprData);
            }
            else
            {
                return(sprData);
            }
        }