是否使“位图透明”成为较小的图像,如字节
本文关键字:图像 字节 位图 透明 位图透明 是否 | 更新日期: 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?