Tag: stream

c#将非常大的位图保存为jpegs(或任何其他压缩格式)

我目前正在处理非常大的图像,这些图像基本上是通过拼接许多较小的图像(例如全景图或照片马赛克软件)生成的。 为了避免内存不足exception(在内存中只是如何排列较小图像的“地图”),我写了一些代码,使用BinaryWriter和LockBits逐行保存这些图像作为位图。 到现在为止还挺好。 现在问题是我想将这些图像保存为Jpegs(或PNG)。 由于我对c#很陌生,我现在只能想到两种方法: 1)类似于位图保存程序。 生成一些jpeg标题并逐行保存大图像,以前以某种方式压缩它们。 我不知道如何执行压缩。 2)将已保存的位图流式传输到内存中并将其保存为编码的jpeg。 由于第二种方法似乎更容易,我尝试过这样的事情: FileStream fsr = new FileStream(“input.bmp”, FileMode.Open, FileAccess.Read); FileStream fsw = new FileStream(“output.jpg”, FileMode.CreateNew, FileAccess.Write); EncoderParameters encoderParameters = new EncoderParameters(1); encoderParameters.Param[0] = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, 80L); Bitmap bmp = new Bitmap(fsr); bmp.Save(fsw, GetEncoder(ImageFormat.Jpeg), encoderParameters); bmp.Dispose(); 现在的问题是save-method尝试首先将位图完全加载到内存中,从而导致内存不足exception。 如果有任何关于如何解决或避免这个问题的建议,我会非常高兴!

我如何在.NET中“分叉”一个流?

如前所述,当BinaryReader或BinaryWriter关闭时,其底层Stream也会关闭(aargh)。 考虑这种情况:例程R通过MemoryStream,比如M ; 我想给M写一些东西,然后将它传递给另一个例程进行更多处理(不一定是写)。 为方便起见,我想在一个BinaryWriter中包装M来完成我的写作。 写完之后,我已经完成了BinaryWriter而不是M void R(MemoryStream M) { using (B = new BinaryWriter(M)) { // write some stuff using B } S(M); // now pass M to another routine for further processing } 但是,我不能在不关闭M情况下处理BinaryStream。 问:有没有办法做以下任何一种情况? 从MemoryStream中提取底层byte [], 克隆一个流 它关闭后重新打开一个流

是不是可以不关闭StreamReader / StreamWriter来保持底层流打开?

我有一个基本上包装Stream用于读/写的类,但该流预计由该类的使用者管理。 为了便于使用,我使用StreamReader和StreamWriter类在流上执行I / O操作。 通常我会将读取器和写入器包装在using块中,但我想避免关闭读取器和写入器,因为这样做也会关闭底层流,我必须保持打开状态。 如果我希望调用者管理基础流,那么在内存/资源管理方面是否安全不关闭StreamReader / StreamWriter? 当流在其他地方明确关闭时,读写器是否会被垃圾收集? public class Wrapper { private Stream _underlyingStream; public Wrapper(Stream underlyingStream) { _underlyingStream = underlyingStream; } public string GetValue() { _underlyingStream.Seek(0, SeekOrigin.Begin); var reader = new StreamReader(_underlyingStream); return reader.ReadToEnd(); // we’re done, but the stream is not ours to close } }

StreamReader ReadLine抛出处置exception而不是返回null

我正在尝试从FTP服务器获取文本文件,然后逐行读取它,将每行添加到列表中。 我的代码似乎符合以下标准模式: var response = (FtpWebResponse)request.GetResponse(); using (var responseStream = response.GetResponseStream()) { using (var reader = new StreamReader(responseStream)) { string line; while((line = reader.ReadLine()) != null) { lines.Add(line); } } } 但是,出于某种原因,当在文件的最后一行调用reader.ReadLine()时,它会抛出一个exception,说“无法访问已处置的对象”。 这真的让我很烦恼。 如果我没记错的话,当没有其他数据时,流的最后一行是null ,对吧? 另外(虽然我不确定这一点),这似乎只在当地发生; 这项服务的现场版本似乎正在顺利进行(虽然有些问题我试图深究)。 我当然不会在日志中看到这个问题。 有人有想法吗? 编辑:这是例外的全文。 System.ObjectDisposedException: Cannot access a disposed object. Object name: ‘System.Net.Sockets.NetworkStream’. at System.Net.Sockets.NetworkStream.Read(Byte[] buffer, Int32 offset, Int32 […]

来自IP cam C#的流

我有以下代码无效。 我的camUrl链接可以正常工作,如果我加载到Firefox并从我的摄像头流,但在运行时我的camUrl没有显示任何内容。 有什么想法吗? public Thread _camThread; private string camUrl = “http://my-domain-ip:2080/videostream.cgi?user=admin&pwd=password”; public HttpWebRequest webReq; public WebResponse webRes; public Stream sr; private void btnStart_Click(object sender, EventArgs e) { if (_camThread == null) _camThread = new Thread(new ThreadStart(RunCam)); _camThread.Start(); } private void RunCam() { try { webReq = (HttpWebRequest)WebRequest.Create(camUrl); webReq.AllowWriteStreamBuffering = true; webReq.Timeout = 20000; using (webRes […]

Json.NET – 直接从流反序列化为动态?

在Json.NET文档中的性能提示的帮助下,我整理了一个从远程资源下载/反序列化JSON的方法: public async Task GetJsonAsync(string url) { using (var stream = await new HttpClient().GetStreamAsync(url)) { using (var sr = new StreamReader(stream)) { using (var jr = new JsonTextReader(sr)) { return new JsonSerializer().Deserialize(jr); } } } } 我想要一个返回dynamic的非generics版本。 用GetJsonAsync(url)调用上面的方法是有效的,直到你尝试访问结果的动态属性,此时我得到: ‘Newtonsoft.Json.Linq.JObject’ does not contain a definition for ‘[MyProperty]’ 我已经看到如何从字符串反序列化为动态 ,但是还没有看到直接从流中执行它的工作示例,这将是更好的,因为它更有内存效率。 这可能吗?

当Stream.Read()存在时,StreamReader的目的是什么?

这一直困扰着我。 我知道Stream是一个抽象类,因此无法实例化,但它具有从中派生的类。 为什么有StreamReader类和Stream.Read()方法( 反之为StreamWriter和Stream.Write() )? 您可以使用300万种不同的方法写入文本文件,尝试在System.IO命名空间中了解所有这些不同的类型和方法是相当令人沮丧的。 我找到了关于作者和读者对象或派生的流对象本身之间的差异的问题和答案,但没有关于这个特定情况的问题。

无缓冲的StreamReader

有没有办法让StreamReader不做任何缓冲? 我正在尝试处理可能是二进制或文本的进程的输出。 输出看起来像HTTP响应,例如 Content-type: application/whatever Another-header: value text or binary data here 我想要做的是使用StreamReader解析标头,然后从其BaseStream或StreamReader读取以处理其余内容。 这基本上就是我的开始: private static readonly Regex HttpHeader = new Regex(“([^:]+): *(.*)”); private void HandleOutput(StreamReader reader) { var headers = new NameValueCollection(); string line; while((line = reader.ReadLine()) != null) { Match header = HttpHeader.Match(line); if(header.Success) { headers.Add(header.Groups[1].Value, header.Groups[2].Value); } else { break; } } […]

保存来自Network Camera RTP Stream的JPEG文件

我有一个RTP Stream插槽,接收来自三星网络摄像机的JPEG流。 我不太了解JPEG格式的工作原理,但我知道这个传入的JFIF或JPEG流给了我JPEG头 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Type-specific | Fragment Offset | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Type | Q | Width | Height | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ and then +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Restart Interval |F|L| Restart Count | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ and then in the first packet, there is this header +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | MBZ | Precision | Length | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Quantization Table Data […]

将PNG图像保存到WP7的隔离存储

这里有相当多的图像到隔离存储问题,但我找不到适合我情况的好答案 – 所以我们走了。 我从网络上获取一个.png图像,并将其保存为BitmapImage -object。 当它完成加载(在BitmapImage.ImageOpened事件上)时,我想将它保存到独立存储。 那么,我怎样才能从这个BitmapImage(或直接来自网络)获取字节或文件流 – 这无关紧要,以便我可以将它写入我的IsolatedStorageFileStream ? 我无法在互联网上找到一篇关于它的文章, BitmapImage.StreamSource适用于WP7(因此BitmapImage.StreamSource不可用).png图像。 任何帮助将不胜感激。