直接从无头图像字节数组创建缩略图

2023-12-02

我的应用程序一次显示大量图像缩略图。目前,我将所有全尺寸图像保留在内存中,并简单地在 UI 中缩放图像以创建缩略图。但是,我宁愿只在内存中保留小缩略图,并且仅在必要时加载全尺寸图像。

我认为这很容易,但与仅在 UI 中缩放全尺寸图像相比,我生成的缩略图非常模糊。

图像是没有标题信息的字节数组。我提前知道大小和格式,因此我可以使用 BitmapSource.Create 来创建 ImageSource。

 //This image source, when bound to the UI and scaled down creates a nice looking thumbnail
 var imageSource = BitmapSource.Create(
     imageWidth,
     imageHeight,
     dpiXDirection,
     dpiYDirection,
     format,
     palette,
     byteArray,
     stride);

using (var ms = new MemoryStream())
{
    PngBitmapEncoder encoder = new PngBitmapEncoder();
    encoder.Frames.Add(BitmapFrame.Create(imageSource);
    encoder.Save(ms);

    var bi = new BitmapImage();
    bi.BeginInit();
    bi.CacheOption = BitmapCacheOption.OnLoad;

    //I can't just create a MemoryStream from the original byte array because there is no header info and it doesn't know how to decode the image!
    bi.StreamSource = ms;
    bi.DecodePixelWidth = 60;
    bi.EndInit();

    //This thumbnail is blurry!!!
    Thumbnail = bi;
}

我猜它很模糊,因为我首先将其转换为 png,但是当我使用 BmpBitmapEncoder 时,我收到“没有可用的成像组件”错误。在本例中,我的图像是 Gray8,但我不确定为什么 PngEncoder 可以计算出来,但 BmpEncoder 不能。

当然,必须有某种方法可以从原始 ImageSource 创建缩略图,而不必先将其编码为位图格式?我希望 BitmapSource.Create 只是让您像 BitmapImage 类一样指定解码宽度/高度。

EDIT

最终答案是使用 TransformBitmap 和 WriteableBitmap 来创建缩略图并消除原始的全尺寸图像。

var imageSource = BitmapSource.Create(...raw bytes and stuff...);
var width = 100d;
var scale = width / imageSource.PixelWidth;
WriteableBitmap writable = new WriteableBitmap(new TransformedBitmap(imageSource, new ScaleTransform(scale, scale)));
writable.Freeze();

Thumbnail = writable;

您应该能够创建一个转换位图从原来的:

var bitmap = BitmapSource.Create(...);
var width = 60d;
var scale = width / bitmap.PixelWidth;
var transform = new ScaleTransform(scale, scale);
var thumbnail = new TransformedBitmap(bitmap, transform);

为了最终摆脱原始位图,您可以从 TransformedBitmap 创建一个 WriteableBitmap:

var thumbnail = new WriteableBitmap(new TransformedBitmap(bitmap, transform));
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

直接从无头图像字节数组创建缩略图 的相关文章

随机推荐

  • 在 Ubuntu 中运行多个独立的 Flask 应用

    我正在尝试使用 Apache 在单独的虚拟目录中运行两个或多个 Flask 应用程序 例如http localhost site1 for var www myapps app1 and http localhost site2 for v
  • heroku db:pull 无法连接到我在 ubuntu 中的数据库

    所以我最近将ubuntu更新到11 04 然后又降级回11 04 因为我讨厌unity 不管怎样 在我重新安装 11 40 后 我必须克隆所有旧的 Heroku 应用程序并尝试运行heroku db pull拉取数据库并将其导入到我的 my
  • 如何从 iPhone 中的 Web 服务获取数据?

    我必须开发一个应用程序 其中包括以下内容 gt 通过 iPhone 向 Web 服务发出请求 gt 从网络服务获取数据 我从未使用过 Web 服务来开发 iPhone 应用程序 但我知道什么是网络服务 The example of web
  • Git 正在转向新的哈希算法 SHA-256,但为什么 git 社区选择 SHA-256

    我刚刚从这件事中学到了HN postgit 正在转向新的哈希算法 从SHA 1 to SHA 256 我想知道是什么让SHA 256最适合 git 的用例 是否有任何 许多强有力的技术原因或者是否有可能SHA 256人气是一个强大的因素吗
  • Android Studio:无法完成 gradle 执行,原因为空

    当我尝试运行 Android 模拟器时 出现以下错误屏幕 当我导出 apk 时也会发生同样的情况 当我转到保存 apk 的目录时 apk 文件不存在 谢谢你 克里斯托夫 我遇到了同样的问题 通过执行以下步骤可以解决此问题 Go to 文件
  • 如何获取 Chrome 扩展程序子文件夹中的文件名列表?

    我想知道是否可以获取 Chrome 扩展程序的子文件夹中所有文件的文件名列表 谢谢你 Use the chrome runtime getPackageDirectoryEntry方法得到一个DirectoryEntry对于 Chrome
  • 将自定义角色分配给 Azure Active Directory 系统托管标识

    为了在 API 之间建立 Azure AD 系统托管标识 我在应用程序清单中为目标 API 定义了一个自定义角色 appRoles allowedMemberTypes Application description Allow the a
  • 在 C# 中测试/注入私有字段的良好做法是什么

    如果这是重复的 我很抱歉 我被赋予了为该方法添加一些覆盖范围的任务 并被告知要模拟私有的List
  • PHP 中的数字格式

    我想将带小数位的数字格式化为不带小数位的格式 例如 146 5 到 146500000 我如何在 PHP 中实现这一点 谢谢 乘以100000 没那么容易
  • 在 Excel 中导入 CSV 美国格式的数字并进行本地化?

    我有一个包含以下值的 csv 文件 1488201602 653 8 304700E 04 3 079498E 03 1488201603 107 8 677357E 04 2 856719E 03 1488201821 012 7 071
  • 另一个线性渐变内的线性渐变

    我正在尝试在另一个线性渐变中创建线性渐变 这可能吗 下面的例子 background linear gradient to right color1 50 color2 0 颜色 1 是 background linear gradient
  • ARM Aarch64 中的 PUSH {lr} 和 POP {lr}

    等效指令是什么PUSH lr and POP lr 在ARM Aarch64指令集中 Is STR X30 SP 8 正确的 您能解释一下维护堆栈对齐的概念吗 我对 ARMv8 比较陌生 所以请原谅 如果您要求 C 编译器从源代码生成汇编语
  • WIX 自定义操作:使用 dllimport

    我有一个 WiX 安装程序和自定义操作项目 我添加了 C 库作为自定义操作项目的参考 此 C dll 使用 DllImport 到一个 C dll 安装时收到错误 无法加载 DLLmycpp dll 未找到指定的模块 我添加了mycpp d
  • 为什么Fortran可以分配这么大的数组?

    我编写了一段科学代码 像往常一样 这归结为计算代数特征值方程中的系数 计算这些系数需要对多维数组进行积分 这会迅速大幅增加内存使用量 一旦计算出矩阵系数 就可以释放原始的预积分多维数组 并由智能求解器接管 因此内存使用不再是大问题 正如您所
  • 指定绘图上多条线的颜色[重复]

    这个问题在这里已经有答案了 Pandas 数据框分组图 我有一个与上述问题类似的数据框 但它有大约 8 个股票代码 我定义了一个名为 颜色 的颜色列表 与股票代码相对应 但是当我这样做时 df groupby ticker adj clos
  • 使用map-reduce构建分布式KD树

    我正在尝试使用map reduce 构建分布式KD 树 分布式KD树的描述可以在这里找到Dkd Tree I have a feature vector of images having dimension 20 I have to bui
  • 如何在powershell中的正则表达式中插入变量

    我试图查看文件中是否存在某些输入的条目 因此我使用正则表达式来查询每一行 cat file where match script fileName 其中 fileName 是其他地方定义的一些输入 如何更改正则表达式以插入变量而不是匹配 f
  • 空手道:[主要] INFO com.intuit.karate - karate.env 系统属性为:null [重复]

    这个问题在这里已经有答案了 在尝试使用生成的令牌执行下一个场景时 在令牌身份验证流程之后出现错误 主要 INFO com intuit karate 空手道系统属性为 null 我使用了以下代码 特征文件 Feature Login Tok
  • Python项目结构和相关导入

    我是Python新手 我在谷歌上搜索了很多 并阅读了一些有关相对导入等的文章 尽管事实上我无法让它工作 请考虑我的以下项目结构 Project docs log prev src a py tests tests1 b py tests2
  • 直接从无头图像字节数组创建缩略图

    我的应用程序一次显示大量图像缩略图 目前 我将所有全尺寸图像保留在内存中 并简单地在 UI 中缩放图像以创建缩略图 但是 我宁愿只在内存中保留小缩略图 并且仅在必要时加载全尺寸图像 我认为这很容易 但与仅在 UI 中缩放全尺寸图像相比 我生