希望尽可能少的损失,因为我听说过一个名叫 Guido Vollbeding 的人提出的实现。标准 GDI+ 似乎没有这种能力,到目前为止我发现的只是规范或完全集成的工具。一个精简的、可插拔的 .NET 组件将是非常可取的。如果我自己实现它,常见的陷阱是什么?
感谢每一个想法和指导!
编辑:我的目标是绕过解压缩到 .NET 位图的明显循环,在那里调整它的大小,然后再次压缩它。这篇文章似乎指向了正确的方法,但到目前为止我从未见过任何 .NET 实现
希望尽可能少的损失,因为我听说过一个名叫 Guido Vollbeding 的人提出的实现。标准 GDI+ 似乎没有这种能力,到目前为止我发现的只是规范或完全集成的工具。一个精简的、可插拔的 .NET 组件将是非常可取的。如果我自己实现它,常见的陷阱是什么?
感谢每一个想法和指导!
编辑:我的目标是绕过解压缩到 .NET 位图的明显循环,在那里调整它的大小,然后再次压缩它。这篇文章似乎指向了正确的方法,但到目前为止我从未见过任何 .NET 实现
这很容易使用 .NET Bitmap 类:
void ResizeImage(string inFname, string outFname, float scale)
{
Bitmap bmpOrig = new Bitmap(inFname);
int w = (int)(scale * bmpOrig.Width);
int h = (int)(scale * bmpOrig.Height);
Bitmap bmpNew = new Bitmap(bmpOrig, new Size(w, h));
bmpNew.Save(outFname, ImageFormat.Jpeg);
}
您需要添加对 System.Drawing 的引用,并在代码中同时使用 System.Drawing 和 System.Drawing.Imaging:
我不能说那会有多少损失。
我不知道任何专门处理 1/(2^n) 的算法,但如果你能找到一个,你将需要能够锁定位图上的位(如果你想要任何合理的速度形式)。使用设置/获取像素是个坏主意。
将它作为位图加载到内存中,然后获取它的数据并使用不安全的代码,就像用 C++ 一样编写来调整它的大小。这是我学习如何快速调整图像大小的地方(我不认为该链接会调整它们的大小,但它向您展示了如何在 .Net 中编写快速成像代码)
在“反汇编”窗口中设置断点并单步执行代码会告诉你你在做什么。避免任何数组访问,只使用指针,数组访问是 .Net 中紧密性能循环的死亡之吻(因为检查索引是否在边界内,然后有条件跳转以抛出 Every.Single 。 使用权。)