使位图透明是一个较小的图像,以字节为单位

时间:2013-08-02 19:40:03

标签: c# optimization graphics bitmap

构建位图并共同构建一些位图并将它们组合成一个位图时,它对.MakeTransparent()有帮助。

或者,在我将Bitmap发送到请求客户端之前,如果我.MakeTransparent()它会变小吗?不是宽度或高度,以字节为单位购买?

换句话说,.MakeTransparent()会优化Bitmap,如果不是,有人会在通过互联网通过网络发送给请求客户端之前获得有关如何优化Bitmap的任何建议吗?

相关代码为sheet.MakeTransparent()

 internal static Task<Bitmap> GetDoorSecheduleSheetAsync(ShopDrawing.DoorSchedules schedules, RotateFlipType rotate, byte schedulesPerSheet, byte currentI)
{
    return Task.Run(() =>
        {
            var sheet = new Bitmap(DrawingOptions.PAGE_HEIGHT_SIZE, DrawingOptions.PAGE_WIDTH_SIZE);
            sheet.SetResolution(150, 150);
            byte scheduleCnt = 0;
            float prevWidth = 0;

            using (Graphics dc = Graphics.FromImage(sheet))
            {
               dc.Clear(Color.White);

                using (Pen pen = new Pen(Color.FromArgb(80, Color.Black), 4))
                {
                    for (; currentI < schedules.Count(); currentI++)
                    {
                        if (scheduleCnt > 0)
                        {
                            dc.DrawLine(pen, prevWidth, 380/*need constant for start height*/, prevWidth, sheet.Height);
                        };

                        using (var doorSchedule = schedules[currentI].Door)
                        {
                            dc.DrawImage(doorSchedule, prevWidth + 50, 380/*need constant for start height*/);
                            prevWidth += doorSchedule.Width + 50;
                            scheduleCnt++;
                        }

                        if (scheduleCnt == schedulesPerSheet)
                        {
                            sheet.RotateFlip(rotate);
                            sheet.MakeTransparent();
                            return sheet;
                        }
                    };
                };
            };
            sheet.MakeTransparent();
            sheet.RotateFlip(rotate);
            return sheet;
        });
}

谢谢!

3 个答案:

答案 0 :(得分:5)

BMP是非压缩格式,每个像素基本上都是原始字节(或调色板索引) - 除了更改每像素位数之外,没有任何转换会改变生成文件的大小。

不要通过网络发送未压缩的bmp - 使用无损PNG / GIF或(如果它适用于你)JPG。

答案 1 :(得分:2)

正如Alexei Levenkov所说,通过网络发送原始BMP格式是 最差 选择

调用MakeTransparent()会(如果不是这样的话)将图像格式转换为32位(=带alpha通道),这是大多数字节饥饿 - 透明度有其成本。

您应该将位图保存为ie jpeg (如果您 确实需要透明度)或 png (如果你真的需要它) - 它们都效率更高

看看这个回答的问题:High Quality Image Scaling Library
它显示了如何使用 .NET内置图像编码器

答案 2 :(得分:1)

当您调用MakeTransparent method时,位图将转换为Format32bppArgb格式,因为此格式支持Alpha通道。

Format32bppArgb 是一种每像素使用32位的格式;每个8位用于alpha,红色,绿色和蓝色分量。因此,这可能意味着尺寸的变化。

但是为了控制真正发生的事情,你可以压缩位图或压缩它,然后将其转换为其他格式,如PNG o JPG Alexei Levenkov 建议

在这里您可以找到如何将PNG转换为BMP的示例,您可以使用相同的代码但交换格式

How to convert PNG to BMP at runtime?