我在创建一个BitmapImage
来自MemoryStream
web请求的png和gif字节时遇到了一些麻烦.这些字节似乎可以很好地下载,并且BitmapImage
创建的对象没有问题,但是图像实际上并没有在我的UI上呈现.仅当下载的图像是png或gif类型时才会出现此问题(适用于jpeg).
以下是演示此问题的代码:
var webResponse = webRequest.GetResponse();
var stream = webResponse.GetResponseStream();
if (stream.CanRead)
{
Byte[] buffer = new Byte[webResponse.ContentLength];
stream.Read(buffer, 0, buffer.Length);
var byteStream = new System.IO.MemoryStream(buffer);
BitmapImage bi = new BitmapImage();
bi.BeginInit();
bi.DecodePixelWidth = 30;
bi.StreamSource = byteStream;
bi.EndInit();
byteStream.Close();
stream.Close();
return bi;
}
Run Code Online (Sandbox Code Playgroud)
为了测试Web请求是否正确获取字节,我尝试了以下操作,将字节保存到磁盘上的文件,然后使用a UriSource
而不是a 加载图像StreamSource
,它适用于所有图像类型:
var webResponse = webRequest.GetResponse();
var stream = webResponse.GetResponseStream();
if (stream.CanRead)
{
Byte[] buffer = new Byte[webResponse.ContentLength];
stream.Read(buffer, 0, buffer.Length);
string fName = "c:\\" + …
Run Code Online (Sandbox Code Playgroud) 假设这个C#代码:
using (MemoryStream stream = new MemoryStream())
{
StreamWriter normalWriter = new StreamWriter(stream);
BinaryWriter binaryWriter = new BinaryWriter(stream);
foreach(...)
{
binaryWriter.Write(number);
normalWriter.WriteLine(name); //<~~ easier to reader afterward.
}
return MemoryStream.ToArray();
}
Run Code Online (Sandbox Code Playgroud)
我的问题是:
MemoryStream.ToArray()
合法吗?我使用using
-block作为约定,我担心它会搞砸了.我应该分配内存还是只分配内存流的对象:这样可以吗?
MemoryStream memoryStream = new MemoryStream();
bitmap.Save(memoryStream, System.Drawing.Imaging.ImageFormat.Jpeg);
Run Code Online (Sandbox Code Playgroud)
如果我需要定义MemoryStream大小,我如何从Bitmap获取它?
这可能是一个非常简单的问题,我认为我所追求的是宣布新MemoryStream的最佳实践
以下2个样本有什么区别:
MemoryStream myStream = new MemoryStream(0x10000);
要么
MemoryStream myStream = new MemoryStream();
显然,我知道第一个例子设置了流的初始容量.但是,这两者都具有可自动调整大小的容量.
我有什么理由为什么我应该使用一种方法而不是另一种方法?
我不确定我做错了什么,看过很多例子,但似乎无法让这个工作.
public static Stream Foo()
{
var memStream = new MemoryStream();
var streamWriter = new StreamWriter(memStream);
for (int i = 0; i < 6; i++)
streamWriter.WriteLine("TEST");
memStream.Seek(0, SeekOrigin.Begin);
return memStream;
}
Run Code Online (Sandbox Code Playgroud)
我正在对这个方法进行一个简单的测试,试图让它通过,但无论如何,我的收集计数为0.
[Test]
public void TestStreamRowCount()
{
var stream = Foo();
using (var reader = new StreamReader(stream))
{
var collection = new List<string>();
string input;
while ((input = reader.ReadLine()) != null)
collection.Add(input);
Assert.AreEqual(6, collection.Count);
}
}
Run Code Online (Sandbox Code Playgroud)
注意:我在上面修改了一些语法而没有在Test方法中进行编译.更重要的是第一种似乎返回空流的方法(我的reader.ReadLine()总是读取一次).不确定我做错了什么.谢谢.
我找到了重新编写旧代码的方法,这些代码将PDF文件签名为新文件,这标志着来自Web服务的MemoryStreams(字节数组).简单吧?那是昨天.今天我无法让它发挥作用.
这是旧代码,它使用FileStreams并且它可以工作:
public static string OldPdfSigner(PdfReader pdfReader, string destination, string password, string reason, string location, string pathToPfx)
{
using (FileStream pfxFile = new FileStream(pathToPfx, FileMode.Open, FileAccess.Read))
{
...
using (PdfStamper st = PdfStamper.CreateSignature(pdfReader, new FileStream(destination, FileMode.Create, FileAccess.Write), '\0'))
{
PdfSignatureAppearance sap = st.SignatureAppearance;
sap.SetCrypto(key, chain, null, PdfSignatureAppearance.WINCER_SIGNED);
sap.Reason = reason;
sap.Location = location;
return destination;
}
}
}
Run Code Online (Sandbox Code Playgroud)
下面是我自己重做的内容,它抛出System.ObjectDisposedException:无法访问已关闭的Stream.
public static byte[] PdfSigner(PdfReader pdfReader, string password, string reason, string location, string pathToPfx)
{
using (FileStream pfxFile = new FileStream(pathToPfx, FileMode.Open, …
Run Code Online (Sandbox Code Playgroud) 我的印象是,当你调用Flush()
StreamWriter对象时,它会写入底层流,但显然我的代码不是这种情况.
而不是写入我的文件,它只会写什么.我出错的任何想法?
public FileResult DownloadEntries(int id)
{
Competition competition = dataService.GetCompetition(id);
IQueryable<CompetitionEntry> entries = dataService.GetAllCompetitionEntries().Where(e => e.CompetitionId == competition.CompetitionId);
MemoryStream stream = new MemoryStream();
StreamWriter csvWriter = new StreamWriter(stream, Encoding.UTF8);
csvWriter.WriteLine("First name,Second name,E-mail address,Preferred contact number,UserId\r\n");
foreach (CompetitionEntry entry in entries)
{
csvWriter.WriteLine(String.Format("{0},{1},{2},{3},{4}",
entry.User.FirstName,
entry.User.LastName,
entry.User.Email,
entry.User.PreferredContactNumber,
entry.User.Id));
}
csvWriter.Flush();
return File(stream, "text/plain", "CompetitionEntries.csv");
}
Run Code Online (Sandbox Code Playgroud) 如何使用c#ImageSource
从MemoryStream
WPF中获取?或转换MemoryStream
,以ImageSource
显示它在WPF的形象?
我真的没有得到它,这让我疯狂.我有这四行:
Image img = Image.FromFile("F:\\Pulpit\\soa.bmp");
MemoryStream imageStream = new MemoryStream();
img.Save(imageStream, ImageFormat.Bmp);
byte[] contentBuffer = new byte[imageStream.Length];
imageStream.Read(contentBuffer, 0, contentBuffer.Length);
Run Code Online (Sandbox Code Playgroud)
调试时我可以看到imageStream中的字节值.在imageStream之后.我检查contentBuffer的内容,我只看到255个值.我不明白为什么会这样?在这几行中没有什么可错的!如果有人能帮助我,我将不胜感激!谢谢,agnieszka
我在声明中收到"Stream is not readable"的消息:
using (StreamReader sr = new StreamReader(ms))
Run Code Online (Sandbox Code Playgroud)
我已经尝试过这里发布的提示但没有成功.谢谢您的帮助.
这是我的代码:
XmlSerializer xmlSerializer = new XmlSerializer(typeof(Conflict));
//Serialize Conflicts array to memorystream as XML
using (MemoryStream ms = new MemoryStream())
{
using (StreamWriter sw = new StreamWriter(ms))
{
foreach (Conflict ct in Conflicts)
xmlSerializer.Serialize(sw, ct);
sw.Flush(); //Site tip
ms.Position = 0; //Site tip
}
//Retrieve memory stream to string
using (StreamReader sr = new StreamReader(ms))
{
string conflictXml = String.Format(CultureInfo.InvariantCulture, "{0}</NewDataSet>",
Run Code Online (Sandbox Code Playgroud) memorystream ×10
c# ×8
.net ×2
image ×2
streamwriter ×2
wpf ×2
bitmap ×1
bitmapimage ×1
buffer ×1
flush ×1
imagesource ×1
itext ×1
pdf ×1
pdfstamper ×1
stream ×1
webrequest ×1