热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

C#.NETBitmap的最大分辨率是多少?

如何解决《C#.NETBitmap的最大分辨率是多少?》经验,为你挑选了2个好方法。

从理论上讲,它应该是65,535 x 65,535,因为你有足够的内存,大约17GB.

但是,创建一个.NET 4.5控制台应用程序来测试它,它会抛出System.ArgumentException:参数无效.

该应用程序是为64位平台构建的.在具有32GB内存的64位平台上运行.我能够获得的最大分辨率是22,000 x 22,000像素.

我找不到任何关于此的文件.

奇怪的是,即使在22,000 x 22,000像素,它也不总是有效.它有时会起作用,它有时会抛出异常.这让我觉得它与连续的内存分配有关,但是有大约30GB的可用内存.

有没有人有这方面的经验?如果我想使用100,000 x 100,000像素图像和更大的图像,那么除了实现我自己的位图之外,最好的方法是什么?

编辑:问题不是.NET最大对象大小.这可以通过针对64位平台,并在应用程序配置中设置gcAllowVeryLargeObjects标志来克服.通过这种方式,我可以让应用程序使用单个整数数组消耗超过15GB的内存.到目前为止,答案似乎在于GDI +的底层实现,但我该如何解决呢?



1> Hans Passant..:

这是Windows强加的GDI +限制.GDI +为位图的像素数据创建内存映射文件视图.这使它非常有效,位图往往很大,MMF有助于保持像素数据不在页面文件中.可以简单地丢弃RAM页面并从文件中重新读取.同样臭名昭着的是,许多程序员看到他们的Save()调用在忘记处理旧位图时失败了.

Windows限制了MMF上的视图大小,换句话说,文件中可以直接寻址的数据量,如本MSDN文章中所述:

由命名文件支持的文件映射对象的大小受磁盘空间的限制.文件视图的大小限制为最大可用的连续虚拟内存块.这最多为2 GB减去进程已经保留的虚拟内存.

"最大可用连续块"是32位进程中的限制,倾向于在大约600 MB左右徘徊,给予或接受.2 GB限制在64位进程中启动.从技术上讲,GDI +可以通过重新映射视图来绕过此限制.但事实并非如此,LockBits()方法(内部也大量使用)效率低下且使用起来非常笨拙.

要使用更大的位图,您需要转移到GDI +,WIC(Windows Imaging Component)的后续版本.通过System.Windows.Media.Imaging命名空间在.NET中公开.



2> John Koerner..:

您正在遇到.net中允许的最大对象大小.这里包含: .Net中的非常大的集合会导致内存不足异常

编辑:您似乎遇到了GDI Plus的限制.汉斯的回答可以为您提供另一种选择.如果你能在限制范围内生活,那么我的答案可以提供一些指导.

知道您可以计算出您可以创建的最大位图.

对象大小的最大值为2GB:2,147,483,648

默认位图是32bpp(4字节),我们可以拥有的最大区域是2GB/4 = 536,870,912

如果我们想要一个正方形,我们可以获得的最大值是sqrt(2GB/4)= 23,170

所以下面的代码工作正常:

Bitmap b = new Bitmap(23170,23170);

但是以下失败了:

Bitmap b = new Bitmap(23171,23170);

如果要存储尺寸较大的图像,则必须将像素格式更改为较低的bpp数:

Bitmap b = new Bitmap(65535,65535, PixelFormat.Format4bppIndexed);


推荐阅读
  • 白话计算机图形学初步-由一个小问题引发的故事
    一、为何写本文  今天在学习android时遇到的一个问题:android程序从网络得到一张图片,显示在程序的imageview中,期间调用了bitmap把字节数组转化成位图文件,才能 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • http:wiki.lazarus.freepascal.orgBGRABitmap_tutorial_1bgrabitmap是一套用来修改和创建图像的单元,可以使用alpha通道,直接 ... [详细]
  • 本文介绍了C#中生成随机数的三种方法,并分析了其中存在的问题。首先介绍了使用Random类生成随机数的默认方法,但在高并发情况下可能会出现重复的情况。接着通过循环生成了一系列随机数,进一步突显了这个问题。文章指出,随机数生成在任何编程语言中都是必备的功能,但Random类生成的随机数并不可靠。最后,提出了需要寻找其他可靠的随机数生成方法的建议。 ... [详细]
  • 本文介绍了C#中数据集DataSet对象的使用及相关方法详解,包括DataSet对象的概述、与数据关系对象的互联、Rows集合和Columns集合的组成,以及DataSet对象常用的方法之一——Merge方法的使用。通过本文的阅读,读者可以了解到DataSet对象在C#中的重要性和使用方法。 ... [详细]
  • 导出功能protectedvoidbtnExport(objectsender,EventArgse){用来打开下载窗口stringfileName中 ... [详细]
  • 先看官方文档TheJavaTutorialshavebeenwrittenforJDK8.Examplesandpracticesdescribedinthispagedontta ... [详细]
  • 本文介绍了使用哈夫曼树实现文件压缩和解压的方法。首先对数据结构课程设计中的代码进行了分析,包括使用时间调用、常量定义和统计文件中各个字符时相关的结构体。然后讨论了哈夫曼树的实现原理和算法。最后介绍了文件压缩和解压的具体步骤,包括字符统计、构建哈夫曼树、生成编码表、编码和解码过程。通过实例演示了文件压缩和解压的效果。本文的内容对于理解哈夫曼树的实现原理和应用具有一定的参考价值。 ... [详细]
  • Android自定义控件绘图篇之Paint函数大汇总
    本文介绍了Android自定义控件绘图篇中的Paint函数大汇总,包括重置画笔、设置颜色、设置透明度、设置样式、设置宽度、设置抗锯齿等功能。通过学习这些函数,可以更好地掌握Paint的用法。 ... [详细]
  • C#多线程解决界面卡死问题的完美解决方案
    当界面需要在程序运行中不断更新数据时,使用多线程可以解决界面卡死的问题。一个主线程创建界面,使用一个子线程执行程序并更新主界面,可以避免卡死现象。本文分享了一个例子,供大家参考。 ... [详细]
  • 文章目录1.数据结构的定义2.查询方法的实现3.修改方法的实现        在Java中使用byte[]字节数组来储存bit,1byte=8bit。对于bit中的第i位,该bit ... [详细]
  • 要点:假如有10亿元素,全部数据读进内存,占用1000000000*4102410241024≈3.725G,爆炸!解决方法:bitmap算法,每一位都能 ... [详细]
  • BitMap的原理和实现方法
    这篇文章主要介绍“BitMap的原理和实现方法”,在日常操作中,相信很多人在BitMap的原理和实现方法问题上存在疑惑,小编查阅了各式资料,整理出简 ... [详细]
  • Android中Bitmap与Drawable的区别有哪些?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更 ... [详细]
  • 在Android中进行图像处理的任务时,有时我们希望将处理后的结果以图像文件的格式保存在内部存储空间中,本文以此为目的,介绍将Bitmap对象的数据以P ... [详细]
author-avatar
FM向前
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有