0

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

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

换句话说,.MakeTransparent() 将优化位图,如果没有,在通过互联网通过网络发送到请求客户端之前,是否有人获得有关如何优化位图的任何建议?

有问题的代码是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;
        });
}

谢谢!

4

3 回答 3

5

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

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

于 2013-08-02T19:43:51.027 回答
2

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

调用 MakeTransparent() 将(如果还没有的话)将图像格式转换为 32 位(= 使用 alpha 通道),这是最需要字节的 - 透明度有其成本。

您应该将 Bitmap 保存为 ie jpeg(如果您真的不需要透明度png(如果您真的需要它) - 它们都更有效率

看看这个已回答的问题:高质量图像缩放库
它展示了如何使用.NET 内置图像编码器

于 2013-08-02T19:59:57.363 回答
1

当您调用MakeTransparent方法时,位图将被转换为Format32bppArgb格式,因为这种格式支持 alpha 通道。

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

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

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

如何在运行时将 PNG 转换为 BMP?

于 2013-08-02T20:00:36.837 回答