有没有什么方法可以安全地进行图像量化并且无需编组?

2024-03-19

我目前正在使用 Brendan Tompkins ImageQuantization dll。http://codebetter.com/blogs/brendan.tompkins/archive/2007/06/14/gif-image-color-quantizer-now-with-safe-goodness.aspx http://codebetter.com/blogs/brendan.tompkins/archive/2007/06/14/gif-image-color-quantizer-now-with-safe-goodness.aspx

但它不能在 asp.net 中以中等信任度运行。

有谁知道在中等信任度下运行的图像量化库?

Update我不在乎解决方案是否缓慢。我只需要一些有用的东西。


您应该能够使用 Marshal 替换代码,并通过 BinaryReader 之类的工具显式读取底层流。这可能会比较慢,因为您必须将流完全读入托管内存或查找它,而不是依赖于非托管内存中已经存在的副本来快速访问,但这从根本上来说是您唯一的选择。

即使仅执行读取操作,您也无法从中等信任上下文深入探索非托管内存。

查看链接的代码后,您会发现不允许执行此类操作是有原因的。首先,他忽略了 IntPtr 的 64/32 位方面!

他使用的底层 BitMapData 类完全基于对任意内存进行不受限制的读取访问,这在中等信任度下永远不会发生。
需要对其基本功能进行重大重写,才能直接使用 BitMap(使用缓慢的 GetPixel 调用)或直接通过传统流 api 读取数据,将其放入数组中,然后自己解析出来。这些都可能不会令人愉快。前者会慢得多(由于每个像素读取的高开销,我预计会是一个数量级),后者慢一些(尽管仍然更慢),但在重写图像数据的低级解析方面有更多的相关工作。

以下是根据当前代码需要更改的粗略指南:

来自 Quantizer.cs

public Bitmap Quantize(Image source)
{
    // Get the size of the source image
    int height = source.Height;
    int width = source.Width;
    // And construct a rectangle from these dimensions
    Rectangle bounds = new Rectangle(0, 0, width, height);
    // First off take a 32bpp copy of the image
    Bitmap copy = new Bitmap(width, height, PixelFormat.Format32bppArgb);
    // And construct an 8bpp version
    Bitmap output = new Bitmap(width, height, PixelFormat.Format8bppIndexed);
    // Now lock the bitmap into memory
    using (Graphics g = Graphics.FromImage(copy))
    {
        g.PageUnit = GraphicsUnit.Pixel;
        // Draw the source image onto the copy bitmap,
        // which will effect a widening as appropriate.
            g.DrawImage(source, bounds);
    }

    //!! BEGIN CHANGES - no locking here
    //!! simply use copy not a pointer to it
    //!! you could also simply write directly to a buffer then make the final immage in one go but I don't bother here

    // Call the FirstPass function if not a single pass algorithm.
    // For something like an octree quantizer, this will run through
    // all image pixels, build a data structure, and create a palette.
    if (!_singlePass)
        FirstPass(copy, width, height);

    // Then set the color palette on the output bitmap. I'm passing in the current palette 
    // as there's no way to construct a new, empty palette.
    output.Palette = GetPalette(output.Palette);
    // Then call the second pass which actually does the conversion
    SecondPass(copy, output, width, height, bounds);
    //!! END CHANGES
    // Last but not least, return the output bitmap
    return output;
}

//!! Completely changed, note that I assume all the code is changed to just use Color rather than Color32
protected  virtual void FirstPass(Bitmap source, int width, int height)
{
    // Loop through each row
    for (int row = 0; row < height; row++)
    {
        // And loop through each column
        for (int col = 0; col < width; col++)
        {            
            InitialQuantizePixel(source.GetPixel(col, row)); 
        }   // Now I have the pixel, call the FirstPassQuantize function...
    }
}

您需要在其他功能中执行大致相同的操作。 这消除了对 Color32 的任何需要,Bitmap 类将为您处理所有这些。

Bitmap.SetPixel()将处理第二遍。请注意,这是最简单的移植方法,但绝对不是在中等信任环境中最快的方法。

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

有没有什么方法可以安全地进行图像量化并且无需编组? 的相关文章

随机推荐

  • 移动端和网络服务器之间的数据同步

    您将如何实施数据同步解决方案来确保移动设备和 Web 服务器上的数据同步 看看这个教程 part one http www raywenderlich com 15916 how to synchronize core data with
  • 我如何判断 CEDET 是否使用 GNU Global?

    我让 CEDET 在 emacs 24 2 上大部分工作 并使用 bzr 的最新版本 存储库 当我搜索符号或定义时 我看到 cedet 迷你缓冲区 显示解析大量文件 其中一些文件不作为头文件 文件 没有任何对我正在搜索的符号的引用 我将让
  • 确保客户端上的文件状态与 NFS 服务器同步

    我正在尝试找到正确的方法来处理 NFS 客户端上的过时数据 考虑以下场景 两台服务器挂载具有多个文件的相同 NFS 共享存储 1 台服务器上的客户端应用程序删除了一些文件 2 个服务器上的客户端应用程序尝试访问已删除的文件并失败并显示 陈旧
  • Mongoid 在 ruby​​ 1.9.3 上失败

    所以我正在玩 mongo 的东西 创建了一个新的heroku应用程序 为其添加了一个mongolab选项 但是每个mongoid方法都失败了 我用谷歌搜索了一下 看起来这个问题在 1 9 3 之前的 ruby 中很常见 但我正在运行 1 9
  • 从文件夹中获取给定扩展名的第一个文件

    我需要获取具有以下内容的文件夹中的第一个文件 tar gz扩大 我想出了 FILE path to folder ls path to folder grep tar gz head 1 但我觉得它可以做得更简单 更优雅 有更好的解决方案吗
  • 在 D3.JS 中使用面积图启动过渡和动画

    我想让面积图在程序开始时从左到右 绘制 本身 我的图表中已经有一条线执行此操作 但是我无法使该线下方的区域正确设置动画 或者在页面首次启动时 绘制 自身 目前 这就是我所在地区的情况 var area d3 svg area x funct
  • 如何只为模态体放置滚动条?

    我有以下元素 div class modal div class modal dialog style max height 85 margin top 50px margin bottom 50px div class modal con
  • 新版本的 Minikube 不允许 Pod 使用自己的服务

    我有一个 Pod 偶尔需要通过自己的主机名来调用自己 我设置了一个部署 最终创建了 Pod 和一个服务 我可以使用集群中不同 Pod 的服务名称 但该 Pod 无法使用其主机名调用自身 这适用于 Minikube v0 17 1 和 Kub
  • 在实例变量中保存块

    我们如何声明一个全局 私有实例变量 来接受其中的块 我们是否需要综合它以及它对内存管理的影响是什么 我有一个从第三方方法收到的块 我想将其保存在实例变量中并在稍后阶段使用它 这是一个 无 ARC 示例 在后台完成一些工作后存储完成回调的块
  • 使用 INPUT 标签的 VALUE 属性(及其值)读取 HTML 表单的innerHTML

    我有一个html form与一些输入字段 而不是读取和发送值input字段由document ipForm userName value 我需要将整个 html 内容发送到 html 解析器并提取
  • StackPanel 逆序 - WPF

    我试图反转子项在 StackPanel 中出现的顺序 我希望能够将新的子项 在运行应用程序时 添加到列表的顶部而不是底部 我尝试过使用各种 XAML 代码 但没有任何效果 做到这一点最简单的方法是什么 Use stackPanel Chil
  • 在 Java 中声明 LinkedList

    当我们声明我们应该做的集合时 我总是学到 Interface ob new Class 如果我想使用例如 LinkedList 我会这样做List ob new LinkedList 但是我无法访问 LinkedList 中的所有方法 不是
  • 标准中关于指针比较的奇怪措辞

    6 5 8 6 http www open std org jtc1 sc22 wg14 www docs n1570 pdf 关于 gt 如果表达式 P 指向数组对象的一个 元素并且 表达式 Q 指向同一个数组对象的最后一个元素 指针表达
  • HTA 如何获取当前用户的用户名?

    我想获取当前用户的用户名 然后在我的应用程序名称中创建一个链接 该链接看起来像 http localhost id username I tried Dim objNetworkSet objNetwork CreateObject WSc
  • 如何使用 char 作为 switch-case 中的 case?

    如何在 switch case 中使用字符 我将收到用户输入的任何第一个字母 import javax swing public class SwitchCase public static void main String args St
  • 如果文本字段为空,则更改按钮元素的样式

    我想改变风格 postBtn if textfield是空的 就像 postBtn textfield value length 0 border color gray background color gray In html
  • 使用组件的 @ViewChild { read: ElementRef } 导致单元测试失败

    在我的组件中 我有一个如下所示的子组件
  • 关于您的项目所依赖的许可证的 Maven 报告[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我有一个大型多模块项目 我想生成一份报告 显示该项目所依赖的所有内容的所有许可证 我查看了 tattl
  • 模拟正在测试的同一类中的私有方法

    我有一个名为的 Java 类 MyClass 我想用 JUnit 进行测试 公共方法 methodA 我想测试调用私有方法 methodB 在同一个类中确定要遵循哪个条件路径 我的目标是为不同路径编写 JUnit 测试methodA 还 m
  • 有没有什么方法可以安全地进行图像量化并且无需编组?

    我目前正在使用 Brendan Tompkins ImageQuantization dll http codebetter com blogs brendan tompkins archive 2007 06 14 gif image c