//============================================================ // <T>序列化位图数据。</T> // // @params output 输出流 // @params colorCount 调色板颜色数量 // @params pixelCount 分块的像素个数 //============================================================ public bool SerializeUnpackIndexed(IOutput output, int colorCount, int pixelCount) { // 若不支持半透明,去掉一个颜色,添加一个透明色 SIntRectangle rect = new SIntRectangle(); rect.Left = 0; rect.Top = 0; rect.Width = _native.Width; rect.Height = _native.Height; // 计算分割信息 int width = rect.Width; int height = rect.Height; int totalPixel = width * height; int splitWidth = width; int splitCount = totalPixel / pixelCount; int splitHeight = height; if (0 == splitCount) { splitHeight = height; splitCount = 1; } else { splitHeight = height / splitCount; splitCount = height / splitHeight; if (0 != (height % splitHeight)) { splitCount++; } } // 写入头信息 ushort option = 0; if (_optionAlpha) { option |= (ushort)EBitmapOption.Alpha; } output.WriteUint16(option); output.WriteUint16((ushort)width); output.WriteUint16((ushort)height); output.WriteUint16((ushort)splitCount); // 要序列化的源矩形区域 SIntRectangle subrect = new SIntRectangle(); subrect.Left = rect.Left; subrect.Top = rect.Top; subrect.Width = splitWidth; subrect.Height = splitHeight; // 源矩形数据 FByteStream bs = new FByteStream(); for (int n = 0; n < splitCount; n++) { bs.Clear(); subrect.Bottom = Math.Min(subrect.Top + splitHeight, rect.Top + height); // 创建图片优化器 FPictureQuantizer pictureQuantizer = null; IColorQuantizer colorQuantizer = null; if (_optionAlpha) { pictureQuantizer = new FPictureQuantizer(EColorQuantizer.Octree); colorQuantizer = pictureQuantizer.LoadQuantizerColors(_native, subrect, FPictureQuantizer.EQuantizedMode.Rgb); } else { pictureQuantizer = new FPictureQuantizer(EColorQuantizer.Octree16); colorQuantizer = pictureQuantizer.LoadQuantizerColors(_native, subrect, FPictureQuantizer.EQuantizedMode.Color); } // 存储图片优化数据 if (SerializeUnpackBlock(bs, colorQuantizer, subrect, colorCount)) { output.WriteUint32((uint)bs.Length); output.WriteBytes(bs.Memory, 0, bs.Length); // _logger.Debug(this, "SerializeIndexed", "index={0}/{1}, rect={2}, size={3}", n, splitCount, rect.ToString(), bs.Length); subrect.Top += splitHeight; } else { RMoCore.TrackConsole.Write(this, "SerializeIndexed", "Picture is all transparent."); return(false); } } return(true); }
//============================================================ // <T>数据打包。</T> //============================================================ public void Pack() { _data.Clear(); Serialize(_data); }