gpt4 book ai didi

c# - 在没有 GDI+ 或 WPF 的情况下在服务器上调整和编码大型 Tiff 图像

转载 作者:行者123 更新时间:2023-11-30 21:14:28 25 4
gpt4 key购买 nike

也许我做错了,但我不认为 WPF 或 GDI+ 类旨在处理服务器上的大图像。我有一个应用程序需要将许多大型 tiff 文件转换为不同的格式和大小。这些文件的缩略图和预览是用 wpf 类生成的,并缓存在磁盘上,所以它们没什么大不了的。

我的问题来自其他未缓存 atm 的高分辨率转换。我正在考虑使用 ImageMagick 来替换这部分的 wpf,看看是否有性能提升,但是当我这样做的时候,我想看看你们是否知道 wpf 和 gdi+ 类的替代方法来处理大型图片文件。

最佳答案

那么,您使用的是哪一个(哪些类)?如果使用得当,通过 PresentationCoreWindowsBase 提供的 Windows 图像组件 (WIC) 功能非常强大。

我不会使用 GDI+,即 System.Drawing,因为那是遗留的而且很慢。

如果您只需要原始处理能力,您是否尝试过横向扩展和分配工作负载?这可以很容易地(在某种程度上)完成,甚至无需投资购买新硬件。

这是我使用计时器和所有方法的主要方法,看来 WIC 东西需要大约 3 秒才能启动,第一次运行比其他运行时间长大约 3 秒。然后时间安排相当一致。我正在内存缓冲以避免从磁盘中提取文件或将文件放入磁盘可能花费的时间。

for (int i = 0; i < 20; i++)
{
var total = new Stopwatch();

var read = new Stopwatch();

var process = new Stopwatch();

total.Start();

using (var inputStream = new FileStream(@"C:\Projects\ConsoleApplication6\ConsoleApplication6\monster.jpg", FileMode.Open))
{
read.Start();

var bytes = new byte[inputStream.Length];

inputStream.Read(bytes, 0, bytes.Length);

read.Stop();

process.Start();

var bitmapImage = new BitmapImage();
bitmapImage.BeginInit();
bitmapImage.StreamSource = new MemoryStream(bytes);
bitmapImage.DecodePixelWidth = 800;
bitmapImage.EndInit();

using (var outputStream = new MemoryStream())
{
var jpegEncoder = new JpegBitmapEncoder();

var frame = BitmapFrame.Create(bitmapImage);

jpegEncoder.Frames.Add(frame);

jpegEncoder.Save(outputStream);

process.Stop();

File.WriteAllBytes(@"C:\Projects\ConsoleApplication6\ConsoleApplication6\monster" + i + ".jpg", outputStream.ToArray());
}
}

total.Stop();

Console.WriteLine("{0:0.000} ms ({1:0.000} ms / {2:0.000} ms)", total.Elapsed.TotalMilliseconds, read.Elapsed.TotalMilliseconds, process.Elapsed.TotalMilliseconds);
}

关于c# - 在没有 GDI+ 或 WPF 的情况下在服务器上调整和编码大型 Tiff 图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6228738/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com