DecodePixelWidth 与 DecodePixelWidth 之间有什么区别?缩放变换?
What is the difference between DecodePixelWidth Vs. ScaleTransform?
我想用来自流的 byte[] 图像制作缩略图。我有两个选项,DecodePixelWidth 或 ScaleTransform。
我的问题:
- 哪个更快?
- 哪种方式更合适?
- 他们每个人做什么?
- 哪个用得少memory/CPU?
第一个:
我更喜欢这种方法。它使用的内存稍微多一些,但速度似乎更快。但是,Idk为什么?它是使用 Matrix 并使用 GPU 来完成工作吗?在这种情况下,我的客户可能会或可能不会像我一样快。
using (var stream = new MemoryStream(rasterizedPage.ImageData, false))
{
var bitmap = DocHelper.ConvertToBitmapImage(stream);
var transform = new ScaleTransform(0.1, 0.1);
var thumbnail = new WriteableBitmap(new TransformedBitmap(bitmap, transform));
byte[] byteImage = DocHelper.ConvertToBytes(thumbnail);
return byteImage;
}
第二个:
此方法占用的内存较少,但速度似乎较慢,而且图像模糊,但它们是缩略图,所以没关系。不过,ScaleTransform 更好吗?
using (var stream = new MemoryStream(rasterizedPage.ImageData, false))
{
byte[] byteImage;
var bitmap = new BitmapImage();
bitmap.BeginInit();
bitmap.DecodePixelWidth = 120;
bitmap.StreamSource = stream;
bitmap.EndInit();
bitmap.Freeze();
byteImage = DocHelper.ConvertToBytes(bitmap);
return byteImage;
}
感谢您的帮助。
经过一番研究,我得出了这个结论。
缩放变换:
根据this, ScaleTransform uses the transformation matrix来计算积分。它还具有
等功能
Freezable Features: ScaleTransform objects can be declared as resources, shared among multiple objects, made read-only to improve
performance, cloned, and made thread-safe.
与 DecodePixelWidth 不同,您还可以使用 ScaleTransform 进行旋转、翻转、创建镜像等操作。看看这些 examples.
何时使用:
- 旋转图像。
- 调整图像大小。
- 翻转图像。
- 创建镜像。
- 使用线程的应用程序。
- 使用图像作为资源。
何时不使用:
- 使图像太大。它会破裂。您的应用程序将使用如此多的内存,您将获得内存异常。看看here.
解码像素宽度:
DecodePixelWidth 是另一个调整图像大小的选项。唯一的问题是它似乎只处理 JPEG/PNG 编解码器。
The JPEG and Portable Network Graphics (PNG) codecs natively decode
the image to the specified size; other codecs decode the image at its
original size and scale the image to the desired size.
事实上,如果您使用 JPEG/PNG 编解码器以外的格式,则会导致 odd behavior if you try to use it with other types of images. You'd be better off modifying the width in XAML. Furthermore, it will distort 您的图像。在我看来,由于在其他格式中它将以原始大小解码图像,因此很可能会将像素靠得太近并扭曲图像。
何时使用:
- JPEG/PNG 编解码器中的图像。
- 将大图像调整为小图像以节省内存。
何时不使用:
- 当您的图像使用与 JPEG/PNG 不同的编解码器时。
结论:
它们只是调整图像大小的两种不同方式,只是 ScaleTransform 具有其他功能并且是更好的选择。
我想用来自流的 byte[] 图像制作缩略图。我有两个选项,DecodePixelWidth 或 ScaleTransform。
我的问题:
- 哪个更快?
- 哪种方式更合适?
- 他们每个人做什么?
- 哪个用得少memory/CPU?
第一个:
我更喜欢这种方法。它使用的内存稍微多一些,但速度似乎更快。但是,Idk为什么?它是使用 Matrix 并使用 GPU 来完成工作吗?在这种情况下,我的客户可能会或可能不会像我一样快。
using (var stream = new MemoryStream(rasterizedPage.ImageData, false))
{
var bitmap = DocHelper.ConvertToBitmapImage(stream);
var transform = new ScaleTransform(0.1, 0.1);
var thumbnail = new WriteableBitmap(new TransformedBitmap(bitmap, transform));
byte[] byteImage = DocHelper.ConvertToBytes(thumbnail);
return byteImage;
}
第二个:
此方法占用的内存较少,但速度似乎较慢,而且图像模糊,但它们是缩略图,所以没关系。不过,ScaleTransform 更好吗?
using (var stream = new MemoryStream(rasterizedPage.ImageData, false))
{
byte[] byteImage;
var bitmap = new BitmapImage();
bitmap.BeginInit();
bitmap.DecodePixelWidth = 120;
bitmap.StreamSource = stream;
bitmap.EndInit();
bitmap.Freeze();
byteImage = DocHelper.ConvertToBytes(bitmap);
return byteImage;
}
感谢您的帮助。
经过一番研究,我得出了这个结论。
缩放变换:
根据this, ScaleTransform uses the transformation matrix来计算积分。它还具有
等功能Freezable Features: ScaleTransform objects can be declared as resources, shared among multiple objects, made read-only to improve performance, cloned, and made thread-safe.
与 DecodePixelWidth 不同,您还可以使用 ScaleTransform 进行旋转、翻转、创建镜像等操作。看看这些 examples.
何时使用:
- 旋转图像。
- 调整图像大小。
- 翻转图像。
- 创建镜像。
- 使用线程的应用程序。
- 使用图像作为资源。
何时不使用:
- 使图像太大。它会破裂。您的应用程序将使用如此多的内存,您将获得内存异常。看看here.
解码像素宽度:
DecodePixelWidth 是另一个调整图像大小的选项。唯一的问题是它似乎只处理 JPEG/PNG 编解码器。
The JPEG and Portable Network Graphics (PNG) codecs natively decode the image to the specified size; other codecs decode the image at its original size and scale the image to the desired size.
事实上,如果您使用 JPEG/PNG 编解码器以外的格式,则会导致 odd behavior if you try to use it with other types of images. You'd be better off modifying the width in XAML. Furthermore, it will distort 您的图像。在我看来,由于在其他格式中它将以原始大小解码图像,因此很可能会将像素靠得太近并扭曲图像。
何时使用:
- JPEG/PNG 编解码器中的图像。
- 将大图像调整为小图像以节省内存。
何时不使用:
- 当您的图像使用与 JPEG/PNG 不同的编解码器时。
结论:
它们只是调整图像大小的两种不同方式,只是 ScaleTransform 具有其他功能并且是更好的选择。