小编Oli*_*rdt的帖子

C#gif图像到MemoryStream并返回(丢失动画)

我有一个小问题,我找不到任何解决方案.我想将GIF转换为byte []然后再转换为GIF.我工作正常,但我失去了动画.

当我开始时它是一个完美的动画GIF(我在一个PictureBox元素中显示它).但是转换后我遇到了第一帧.

HttpWebRequest httpWebRequest = (HttpWebRequest)HttpWebRequest.Create("creativetechs.com/i/tip_images/ExampleAnimation.gif");
HttpWebResponse httpWebReponse = (HttpWebResponse)httpWebRequest.GetResponse();
Stream stream = httpWebReponse.GetResponseStream();
Image img = Image.FromStream(stream);

MemoryStream ms = new MemoryStream();
img.Save(ms,img.RawFormat);
byte [] bytes = ms.ToArray();
Image img2 = Image.FromStream(new MemoryStream(bytes));

int frames1 = img.GetFrameCount(System.Drawing.Imaging.FrameDimension.Time);
int frames2 = img2.GetFrameCount(System.Drawing.Imaging.FrameDimension.Time);
Run Code Online (Sandbox Code Playgroud)

我也尝试过不使用RawFormat System.Drawing.Imaging.ImageFormat.Gif.没改变一件事.frames1是正确的帧数.frames2是1.

PictureBox我的GUI中有2个元素.一个展示img和另一个img2.但是img2不是动画img.怎么了?

我也尝试使用序列化来创建我的byte [].

我将图像序列化并再次反序列化,它也没有改变任何东西.这怎么可能?

c# animation gif stream

13
推荐指数
1
解决办法
8883
查看次数

大对象堆碎片,数组问题

我正在用C#编写一个分析应用程序,它必须处理大量内存.我使用ANTS Memory Profiler 7.4来优化我的内存管理.在这样做的时候,我意识到我使用的所有双[,]数组(我需要它们)都放在LOH上,尽管这些数组中最大的是大约24.000字节.据我所知,对象不应该放在85.000字节之前.问题是现在,因为我有大约几千个这些双[,]数组的实例,我有很多内存碎片(我的总内存使用量的约25%是我无法使用的可用内存).存储在LOH上的这些数组中的一些甚至只有1.036字节.问题是,有时我必须执行更大的分析,然后由于LOH碎片导致大量内存丢失,我最终会出现内存不足的异常.

有没有人知道为什么会发生这种情况虽然根据定义它不应该是一个大对象?

使用ANTS Memory Profiler记录我的应用程序的快照

小双排列也受此影响(数组中只有70个元素)

c# memory-management out-of-memory large-object-heap

8
推荐指数
1
解决办法
1477
查看次数

C#中的大,奇比图像调整大小

我有一个特殊的问题,我需要帮助.我正在处理复杂的蛋白质组学数据,我们的一个图表涉及原始数据的热图.这些热图我计算为原始图像,然后我调整大小以适合我的图表画布.当涉及宽度与高度时,以这种方式生成的图像文件通常非常不平衡.通常,这些图像的宽度大约为10到100像素,高度为5000到8000像素(这是我必须转换为图像的原始2D数据阵列的大小).之后的目标分辨率将是1300 x 600像素.

我通常使用此功能将图像大小调整为目标大小

public static Image Resize(Image img, int width, int height) {
   Bitmap bmp = new Bitmap(width, height);
   Graphics graphic = Graphics.FromImage((Image)bmp);
   graphic.InterpolationMode = InterpolationMode.NearestNeighbor;
   graphic.PixelOffsetMode = PixelOffsetMode.Half;


   graphic.DrawImage(img, 0, 0, width, height);
   graphic.Dispose();

   return (Image)bmp;
}
Run Code Online (Sandbox Code Playgroud)

这通常适用于上述尺寸.但现在我有了一个尺寸为6 x 54343像素的新数据集.在此图像上使用相同的代码时,已调整大小的图像为半空白.

原始图片:http: //files.biognosys.ch/FileSharing/20170427_StackOverflow/raw.png

(原始图像在大多数浏览器中无法正常显示,因此请使用"将链接另存为...")

应该如何看待(使用photoshop):http: //files.biognosys.ch/FileSharing/20170427_StackOverflow/photoshop_resize.png

当我使用上面的代码时,它的外观如何剪切 http://files.biognosys.ch/FileSharing/20170427_StackOverflow/code_resized.png

请记住,对于6 x 8000的图像,这已经工作多年没有问题,所以我想我在这里没有做任何根本性的错误.同样重要的是我有调整大小的NearestNeighbor插值,因此任何涉及其他插值的解决方案都不会导致"如何看"图像最终对我没用.

奥利

c# graphics interpolation resize image

7
推荐指数
1
解决办法
315
查看次数

C#System.Buffer.BlockCopy内存问题?

我有一个困扰我现在几天的问题.我曾试图谷歌这个问题,但到目前为止还没有找到任何解决方案,甚至没有一个人有同样的问题.

似乎C#方法System.Buffer.BlockCopy给你留下了某种内存鬼.我有这样的方法:

private float[,] readFloatArray2 (byte[] b) {
   int floatSize = sizeof(float);
   float[,] v = new float[2, (b.Length / 2) / floatSize];
   System.Buffer.BlockCopy(b, 0, v, 0, b.Length);

   return v;
}
Run Code Online (Sandbox Code Playgroud)

将字节数组转换为2D浮点数组.先前从流中读取数据.我已将问题定位为System.Buffer.BlockCopy方法.

如果我删除BlockCopy命令,应用程序使用的内存将是一半大小.这意味着字节数组仍然存在并不是我的错.因为没有BlockCopy命令,字节数组正常死亡.无论如何都会创建float数组(包含或不包含复制的信息).

我不太确定这是否是BlockCopy命令或GC的问题,因为我还试图调用System.GC.Collect(); 在BlockCopy之后,它也完美无缺(我知道你不应该这样做......这就是为什么我在这里要求建议).

我也不会打扰,但问题涉及几百兆.

除了内存问题,该方法工作得很好.有谁知道导致内存问题的原因是什么?

问候和提前感谢oli

ps:我使用.NET4.0与Visual Studio 2010 PRO和WIN7 ...不知道这是否相关.

c# buffer garbage-collection memory-leaks

6
推荐指数
1
解决办法
4272
查看次数

如何手动锁定其他应用程序的文件

我花了很多时间搞清楚如何做到这一点,但没有找到任何有用的解决方案.

这就是我想要做的.我在我的应用程序中生成一个巨大的二进制文件.棘手的是,这个过程需要我偶尔关闭FileStream.现在的问题是,偶尔其他应用程序(即我的病毒扫描程序)正在使用文件未被锁定的这个短暂时刻,以锁定文件本身.或其他应用程序,如Dropbox等......

结果是,下次我需要打开文件流时,它会说它被另一个进程锁定.所有这些只是很少发生,但它发生时仍然很烦人.即使我仍然获得文件访问权限,我仍然不希望dropbox上传此文件直到完成(可能需要几分钟).

我需要的是手动锁定文件的可能性,以便我的应用程序仍然可以在此文件上打开文件流,但在我再次手动解锁之前,没有其他应用程序可以.

我用伪代码画出这样的东西:

 File.Lock(filepath);

 //... do something that opens and closes filestreams on this file

 File.Unlock(filepath);
Run Code Online (Sandbox Code Playgroud)

有没有办法做到这一点?"保持文件流打开"的解决方案无效.我明确地试图避免这种情况,所以请记住这一点.

.net c# io file file-locking

5
推荐指数
1
解决办法
3775
查看次数