Beispiel #1
0
        //============================================================
        // <T>序列化位图数据。</T>
        //
        // @params output     输出流
        // @params colorCount 调色板颜色数量
        // @params pixelCount 分块的像素个数
        //============================================================
        public bool SerializeIndexed3d(IOutput output, SIntRectangle rect, int colorCount)
        {
            // 写入设置
            output.WriteUint8(_optionAlpha ? (byte)1 : (byte)0);
            // 写入属性
            output.WriteUint16((ushort)Width);
            output.WriteUint16((ushort)Height);
            output.WriteUint16((ushort)rect.Left);
            output.WriteUint16((ushort)rect.Top);
            output.WriteUint16((ushort)rect.Width);
            output.WriteUint16((ushort)rect.Height);
            // 若不支持半透明,去掉一个颜色,添加一个透明色
            if (!_optionAlpha)
            {
                colorCount--;
            }
            // 写入头信息
            FPictureQuantizer pictureQuantizer = null;
            IColorQuantizer   colorQuantizer   = null;

            if (_optionAlpha)
            {
                pictureQuantizer = new FPictureQuantizer(EColorQuantizer.Octree);
                colorQuantizer   = pictureQuantizer.LoadQuantizerColors(_native, rect, FPictureQuantizer.EQuantizedMode.Rgb);
            }
            else
            {
                pictureQuantizer = new FPictureQuantizer(EColorQuantizer.Octree16);
                colorQuantizer   = pictureQuantizer.LoadQuantizerColors(_native, rect, FPictureQuantizer.EQuantizedMode.Color);
            }
            SerializeUnpackBlock3d(output, colorQuantizer, rect, colorCount);
            return(true);
        }
Beispiel #2
0
        //============================================================
        // <T>序列化位图数据。</T>
        //
        // @params output     输出流
        // @params colorCount 调色板颜色数量
        // @params pixelCount 分块的像素个数
        //============================================================
        public bool Serialize(IOutput output, SIntRectangle rect, int colorCount)
        {
            // 写入设置
            output.WriteBool(_optionAlpha);
            // 写入属性
            output.WriteUint16((ushort)_size.Width);
            output.WriteUint16((ushort)_size.Height);
            output.WriteUint16((ushort)rect.Left);
            output.WriteUint16((ushort)rect.Top);
            output.WriteUint16((ushort)rect.Width);
            output.WriteUint16((ushort)rect.Height);
            // 若不支持半透明,去掉一个颜色,添加一个透明色
            //if (!_optionAlpha) {
            //   colorCount--;
            //}
            // 写入头信息
            FPictureQuantizer pictureQuantizer = null;
            IColorQuantizer   colorQuantizer   = null;

            if (_optionAlpha)
            {
                pictureQuantizer = new FPictureQuantizer(EColorQuantizer.Octree);
                colorQuantizer   = pictureQuantizer.LoadQuantizerColors(_bitmap, rect, FPictureQuantizer.EQuantizedMode.Rgb);
            }
            else
            {
                pictureQuantizer = new FPictureQuantizer(EColorQuantizer.Octree16);
                colorQuantizer   = pictureQuantizer.LoadQuantizerColors(_bitmap, rect, FPictureQuantizer.EQuantizedMode.Color);
            }
            using (FByteStream stream = new FByteStream()) {
                SerializeUnpack(stream, colorQuantizer, rect, colorCount);
                output.WriteInt32(stream.Length);
                output.WriteBytes(stream.Memory, 0, stream.Length);
            }
            return(true);
        }
Beispiel #3
0
        //============================================================
        // <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);
        }
Beispiel #4
0
        //============================================================
        // <T>序列化位图数据。</T>
        //
        // @params output     输出流
        // @params colorCount 调色板颜色数量
        // @params pixelCount 分块的像素个数
        //============================================================
        public bool Serialize(IOutput output, int colorCount, int pixelCount)
        {
            // 计算分割信息
            int width       = _validSize.Width;
            int height      = _validSize.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++;
                }
            }
            // 写入头信息
            output.WriteBool(_optionAlpha);
            output.WriteUint16((ushort)_size.Width);
            output.WriteUint16((ushort)_size.Height);
            output.WriteUint16((ushort)_validLocation.X);
            output.WriteUint16((ushort)_validLocation.Y);
            output.WriteUint16((ushort)_validSize.Width);
            output.WriteUint16((ushort)_validSize.Height);
            output.WriteUint16((ushort)splitCount);
            // 若不支持半透明,去掉一个颜色,添加一个透明色
            //if (!_optionAlpha) {
            //   colorCount--;
            //}
            // 要序列化的源矩形区域
            SIntRectangle subrect = new SIntRectangle();

            subrect.Left   = _validLocation.X;
            subrect.Top    = _validLocation.Y;
            subrect.Width  = splitWidth;
            subrect.Height = splitHeight;
            // 源矩形数据
            FByteStream data = new FByteStream();

            for (int n = 0; n < splitCount; n++)
            {
                subrect.Bottom = Math.Min(subrect.Top + splitHeight, _validLocation.Y + height);
                // 创建图片优化器
                FPictureQuantizer pictureQuantizer = null;
                IColorQuantizer   colorQuantizer   = null;
                if (_optionAlpha)
                {
                    pictureQuantizer = new FPictureQuantizer(EColorQuantizer.Octree);
                    colorQuantizer   = pictureQuantizer.LoadQuantizerColors(_bitmap, subrect, FPictureQuantizer.EQuantizedMode.Rgb);
                }
                else
                {
                    pictureQuantizer = new FPictureQuantizer(EColorQuantizer.Octree16);
                    colorQuantizer   = pictureQuantizer.LoadQuantizerColors(_bitmap, subrect, FPictureQuantizer.EQuantizedMode.Color);
                }
                // 存储图片优化数据
                if (SerializeBlock(data, colorQuantizer, subrect, colorCount))
                {
                    // _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, "Serialize", "Picture is all transparent.");
                    return(false);
                }
            }
            output.WriteInt32(data.Length);
            output.WriteBytes(data.Memory, 0, data.Length);
            return(true);
        }