是否使“位图透明”成为较小的图像,如字节

本文关键字:图像 字节 位图 透明 位图透明 是否 | 更新日期: 2023-09-27 18:26:26

当构建位图并共同构建几个位图并将其组合为一个位图时,这对.MakeTransparent().有帮助吗

或者,在我将位图发送到请求客户端之前,如果I.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;
        });
}

谢谢!

是否使“位图透明”成为较小的图像,如字节

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

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

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

调用MakeTransparent()会(如果还不是这样的话)将图像格式转换为32位(=使用alpha cannel),这是最需要字节的——透明度是有代价的。

您应该将位图另存为jpeg(如果您确实需要透明度)或png

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

调用MakeTransparent方法时,位图将转换为Format32bppArgb格式,因为此格式支持alpha通道。

Format32bppArgb是一种每像素使用32位的格式;每个8位用于阿尔法、红色、绿色和蓝色分量。因此,这可能意味着规模的改变。

但是,为了控制实际发生的事情,您可以压缩位图或通过将其转换为其他格式进行压缩,如Alexei Levenkov建议的

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

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