是否可以使用System.Drawing.Image的FromStream方法而不必在图像的生命周期内保持流打开?
我有它加载了一堆从资源文件工具栏的图形,使用的组合应用程序Image.FromStream和Assembly.GetManifestResourceStream.
我遇到的问题是在Windows 7上工作正常,在Windows XP上,如果禁用链接到其中一个图像的用户界面元素,应用程序将崩溃.在Windows 7上,图像以灰度渲染.在XP上,它因内存不足异常而崩溃.
经过大量的脱毛后,我终于将它追溯到图像的初始加载.当然,如果我创建任何实现的对象IDisposable也在同一个方法中被销毁,我将它包装在using语句中,例如
using (Stream resourceStream = assembly.GetManifestResourceStream(resourceName))
{
image = Image.FromStream(resourceStream);
}
Run Code Online (Sandbox Code Playgroud)
如果我删除using语句以便不处理流,则应用程序不再在XP上崩溃.但我现在有一堆"孤儿"流 - 图像存储在命令类中,这些图像在处理时正确处理图像,但原始流不是.
我检查了文档,FromStream确认流需要保持打开状态.为什么这个没有在Windows 7开发系统上崩溃和烧毁是一个谜!
我真的不希望这个流徘徊,我当然不希望存储对这个流以及图像的引用,以便我以后可以处理它.我只需要那个流一次,所以我想摆脱它:)
是否有可能创建图像,然后杀死那里的流?
在C#中,是否可以在float上执行ToString并在不使用指数的情况下获取值?
例如,请考虑以下事项:
float dummy;
dummy = 0.000006F;
Console.WriteLine(dummy.ToString());
Run Code Online (Sandbox Code Playgroud)
这给出了输出
6E-06
Run Code Online (Sandbox Code Playgroud)
但是,我的意思是
0.000006
Run Code Online (Sandbox Code Playgroud)
我能找到的最接近的是使用"F"限定符,但是我需要指定小数位数,否则值将被舍入.
实际上是否有一种自动执行此操作的方法,或者我需要加载一些时髦的逻辑来修剪零或计算出所需的小数位数.
谢谢;
理查德莫斯
如果你考虑下面的图像,它是一个相当基本的图标,大小为32x32.图标周围是一个透明的矩形,虽然我在测试时用纯色填充了四个角.

现在考虑一下这个代码,它只是绘制图像,但规模更大:
protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e);
e.Graphics.InterpolationMode = InterpolationMode.NearestNeighbor;
e.Graphics.DrawImage(Properties.Resources.icon_32a, new RectangleF(0, 0, 512, 512), new RectangleF(0, 0, 32, 32), GraphicsUnit.Pixel);
}
Run Code Online (Sandbox Code Playgroud)
请注意,我正在绘制完整的图像,我不会尝试以任何方式裁剪它,只需将其放大即可.
最后,这是测试给我的输出:

注意问题?顶行和左列中的一半像素消失了.如果我然后尝试在此顶部覆盖一个网格,它看起来非常糟糕,因为网格正确对齐,但图像不是.即使只是将大小加倍到64,64引入了第一行/列裁剪.
注意,我也尝试偏移目标矩形,以防它在0,0之前绘制,但事实并非如此.
我也试过使用不同的插值模式,但据我所知,引起模糊的头痛,像素仍然被裁剪,所以我不相信这是由于插值模式.
我也试图使用不同的图形模式,但除了它似乎没有帮助的事实,我还是需要坚持使用像素.
出于好奇,我再次尝试使用96dpi的新图像副本并获得相同的效果,因此我认为这不是源图像的分辨率.
抓住吸管而Rectangle不是使用RectangleF也没有效果.
任何人都可以提供任何线索,说明为什么这种明显的作物正在发生?
谢谢;
我倾向于使用Regionerate来重新组织我的代码文件.我唯一的问题是我无法在VS2012注册.我完全放弃了VS2010而转而支持VS2012,因为只需运行一个宏来重新组织代码文件就不用担心了.我之前从未尝试过编写VS插件,所以我对对象模型或者如何注册并不熟悉 - 似乎旧的插件比VS2010扩展更复杂!我还查看了WIX设置XML并尝试复制注册表项无济于事.
有没有人知道如何在VS2012中注册Regionerate,或者是否有提供相同功能的替代(免费和维护!)扩展?
示例http://xthlegion.co.uk/images/dividerectangle.png 示例http://xthlegion.co.uk/images/dividerectangle2.png
如果您考虑上面的图像,您可以看到它们由一个大的矩形组成,该矩形通过用户定义的坐标对分解成较小的矩形(示例图像中的每一对都用不同的颜色标识).
我想要做的是通过仅定义连接来获得那些矩形的坐标.边缘被视为显式连接.订单无关紧要.
有没有人知道这样做的算法的名称(我确定有一个有花哨的名字!)或者有一些示例C#代码?我一直在努力尝试这样做一段时间,但我没有成功.又一次全数学失败了!
更新:
我想我会根据收到的评论快速更新这个问题.
第二次更新 - 它的工作原理:)
示例http://xthlegion.co.uk/images/dividerectangle3.png
我收到了一个应用程序的崩溃报告,该应用程序尝试从之前编写的文件中读取XML.在请求用户将文件发送给我之后,我将其与应该写的文件进行了比较,发现了一个我之前没有遇到过的奇怪问题.
一些(但不是全部)i角色已被替换为?- 无点的我.例如,一个名为"title"的节点很好,但名为"initialdirectory"的节点有第一个被替换,第二个被单独留下,即?nitialdirectory.
直到今天,我甚至都不知道有这样一个角色,但现在我做了,我只是不知道它是如何编写的那样 - XML是XmlWriter用UTF8编码编写的.只是一般的日常写作,没有什么复杂的.
我通常(好吧,因为得到Resharper并且它在跳过参数StringComparison.OrdinalIgnoreCase时对我大吼大叫)在做IndexOf等时使用,但我在编写数据时应该如何做到这一点我不知所措,除非我应该开始改变线程文化.
以前有没有人遇到类似的问题,如果有的话,最好的方法是什么?
在部署之前,我使用XP VM和Vista VM对我的应用程序进行烟雾测试.这两款VM都使用32位色.不确定它是否有任何区别,但我正在使用VirtualBox.每台机器还分配2GB内存,2个处理器.XP有128MB的视频RAM,Vista 256(在每种情况下我可以设置它们的最大值).运行机器的桌面有6个内核和16GB内存.同样,不确定这些信息是否相关但谁知道.
以下是我使用的扩展方法,以便将一个Bitmap像素转换为可以直接使用的像素.因为,毕竟我们需要速度.速度是我们所需要的.油腻,速度快!和Bitmap.GetPixel是相反的.
public static ArgbColor[] GetPixels(this Bitmap bitmap)
{
ArgbColor[] results;
int width;
int height;
BitmapData bitmapData;
width = bitmap.Width;
height = bitmap.Height;
results = new ArgbColor[width * height];
bitmapData = bitmap.LockBits(new Rectangle(0, 0, width, height), ImageLockMode.ReadWrite, PixelFormat.Format32bppArgb);
unsafe
{
ArgbColor* pixelPtr;
pixelPtr = (ArgbColor*)(void*)bitmapData.Scan0;
for (int row = 0; row < height; row++)
{
for (int col = 0; col < width; col++)
{
results[row * width + col] = *pixelPtr;
pixelPtr++;
}
} …Run Code Online (Sandbox Code Playgroud) 我一直在尝试使用ReactJS创建基于组件的UI,而不是我通常的一百万个全局函数,变量和不可重用标记的slapdash方法.到目前为止,我真的很喜欢React,但我遇到了绊脚石.
请考虑以下组件布局
EventView
EventViewSidebar
EventViewList
EventViewListRow
EventViewDetail
Run Code Online (Sandbox Code Playgroud)
在此布局中,EventViewListRow每个唯一键存在多次出现.单击EventViewListRow应该更新的实例EventViewDetail以及该项目的详细信息.
这是render顶级EventView组件的功能:
render: function () {
return (
<div className="event-view row-fluid">
<div className="event-view__sidebar col-md-4">
<EventViewSidebar projectId={this.state.projectId} />
</div>
<div className="event-view__content col-md-8" id="eventDetail">
</div>
</div>
);
}
Run Code Online (Sandbox Code Playgroud)
这是EventViewDetail组件
var EventViewDetail = React.createClass({
getInitialState: function () {
return { eventId: 0 };
},
render: function () {
if (this.state.eventId === 0) {
return (<h3>Nothing selected</h3>);
}
else {
return (
<div>
{this.state.eventId}
</div> …Run Code Online (Sandbox Code Playgroud) 我最近在分析一个应用程序,试图弄清楚为什么某些操作非常慢.我的应用程序中的一个类是基于LinkedList的集合.这是一个基本的大纲,只显示了几种方法,并删除了一些绒毛:
public class LinkInfoCollection : PropertyNotificationObject, IEnumerable<LinkInfo>
{
private LinkedList<LinkInfo> _items;
public LinkInfoCollection()
{
_items = new LinkedList<LinkInfo>();
}
public void Add(LinkInfo item)
{
_items.AddLast(item);
}
public LinkInfo this[Guid id]
{ get { return _items.SingleOrDefault(i => i.Id == id); } }
}
Run Code Online (Sandbox Code Playgroud)
该集合用于在单个列表中存储超链接(由LinkInfo类表示).但是,每个超链接还有一个指向它的超链接列表,以及它指向的超链接列表.基本上,它是一个网站的导航地图.因为这意味着当链接回到彼此时你可以进行无限递归,我将它实现为一个链表 - 据我所知,它意味着每个超链接,无论多少次被另一个超链接引用,只有永远只有一个对象的副本.
上例中的ID属性是GUID.
随着冗长的描述,我的问题很简单 - 根据分析器,当为一个相当小的网站构建这个地图时,上面提到的索引器被称为不少于27906次.这是一笔非凡的金额.如果真的有必要多次调用,我仍然需要解决,但同时,我想知道是否有更有效的方法来执行索引器,因为这是分析器识别的主要瓶颈(同样假设它没有说谎!).我仍然需要链表行为,因为我当然不希望这些超链接的多个副本浮动在我的内存周围,但我也需要能够通过一个唯一的密钥访问它们.
有没有人有任何关于提高这个索引器性能的建议.我还有另一个使用URI而不是GUID的索引器,但由于构建传入/传出链接是由GUID完成的,因此问题较小.
谢谢; 理查德莫斯