我有一张我在移动应用程序中拍摄的屏幕截图。当在磁盘上另存为 png 时,屏幕截图大约需要 32 KB。
我将这些发送到中央 SQL Server,32 KB 对于我需要存储该屏幕截图的次数来说太大了(每天大约 2500 次)。
有什么技巧可以让我节省更多的钱吗?
这是我现在使用的代码,将它从 Bitmap
转换为字节(发送到服务器进行存储):
MemoryStream stream = new MemoryStream();
_signatureImage.Save(stream, ImageFormat.Png);
return stream.ToArray();
_signatureImage
是一个 Bitmap
并且是有问题的屏幕截图。
这是我正在保存的屏幕截图示例:
突然想到的事情(但我不知道该怎么做):
- 减小图像的实际高度和宽度(但希望不会扭曲图像)。
- 将其更改为黑白图像(不确定我是否会因此看到任何真正的空间节省)
- 压缩得更多(我不太喜欢这样,因为这样它就无法从数据库中读取)。
请注意,这一切都必须以编程方式完成,并且不能花费很长时间,因此复杂的图像操作已经过时了。
感谢您的帮助。
最佳答案
private static Image ResizeImage(int newSize, Image originalImage)
{
if (originalImage.Width <= newSize)
newSize = originalImage.Width;
var newHeight = originalImage.Height * newSize / originalImage.Width;
if (newHeight > newSize)
{
// Resize with height instead
newSize = originalImage.Width * newSize / originalImage.Height;
newHeight = newSize;
}
return originalImage.GetThumbnailImage(newSize, newHeight, null, IntPtr.Zero);
}
这应该适用于您的位图对象类型并调整高度或宽度的大小,具体取决于哪个适合您的图像尺寸。它还将保持规模。
编辑:
您可以创建一个新的 Bitmap 对象并将原始图像的大小调整为该 Bitmap 对象。
Bitmap b = new Bitmap(newWidth, newHeight);
Graphics g = Graphics.FromImage((Image)b);
g.InterpolationMode = InterpolationMode.HighQualityBicubic;
g.DrawImage(imgToResize, 0, 0, newWidth, newHeight);
g.Dispose();
return (Image)b;
我没有安装 Compact Framework,但它似乎适合您。
关于c# - 如何在 C# 和 .NET 3.5 中减小图像的大小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3885395/