[英]Does making a Bitmap Transparent a smaller image, as in bytes
當構建位圖並共同構建一些位圖並將它們組合為一個位圖時,它有助於.MakeTransparent()。
或者,如果我將Bitmap發送給請求的客戶端,如果我將其設為.MakeTransparent(),它將變小嗎? 不是寬度或高度,以字節為單位購買?
換句話說,.MakeTransparent()會優化位圖,如果沒有,那么在通過Internet通過網絡發送給請求的客戶端之前,沒有人會得到關於如何優化位圖的任何建議嗎?
有問題的代碼是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通道),這是大多數字節消耗的-透明性有其代價。
你應該將位圖保存為JPEG格式 ,即(如果你並不真的需要透明度 )或png
(如果你真的需要它) -他們都更加高效 。
查看有關此問題的解答: 高質量圖像縮放庫
它顯示了如何使用.NET內置圖像編碼器 。
當您調用MakeTransparent方法時 ,位圖將轉換為Format32bppArgb格式,因為該格式支持alpha通道。
Format32bppArgb是一種每像素使用32位的格式。 每個8位用於alpha,紅色,綠色和藍色分量。 因此,這可能意味着尺寸改變。
但是,為了控制實際發生的情況,您可以壓縮位圖或通過將其轉換為PNG或JPG格式的其他格式來壓縮它,如Alexei Levenkov建議的那樣
在這里,您可以找到有關如何將PNG轉換為BMP的示例,可以使用相同的代碼但交換格式
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.