我正在為我的 c# 專案創建一個照片編輯應用程式。我需要支持不同的影像格式,但首先,我選擇了一種非常簡單的格式——PNM。目前,我可以打開 PNM 影像并更改配色方案,但在保存時會發生奇怪的事情。在 macOS 上保存影像時,一切正常,但在 Windows 上嘗試類似的操作后,我得到了一個奇怪的效果,保存后每個新的打開都以 1 個位元組的偏移讀取顏色。
這是影像的示例: example image
這就是在 Windows 上加載并重新打開它后發生的情況: 損壞的影像
假設問題出在保存影像的方法上是合乎邏輯的。我先把整個檔案頭寫到流中,然后把顏色位元組一個一個寫進去。
我無法弄清楚到底是什么問題,因為在除錯時,正在寫入的位元組陣列不包含任何額外的內容。在記事本中打開保存前后的影像,我沒有發現任何明顯的變化。
這是我保存在檔案中的實作:
public void SaveTo(Stream stream)
{
_filter.WriteHeader(stream, _image);
foreach (var (x, y) in _enumerationStrategy.Enumerate(Width, Height))
{
var triplet = _image[x, y];
_filter.Write(stream, triplet, _converterProvider.Converter);
}
}
public void WriteHeader(Stream stream, IBitmapImage image)
{
var builder = new StringBuilder();
builder.AppendLine("P6");
builder.AppendLine($"{image.Width} {image.Height}");
builder.AppendLine("255");
var header = builder.ToString();
var headerBytes = Encoding.UTF8.GetBytes(header);
stream.Write(headerBytes, 0, headerBytes.Length);
}
我嘗試在沒有字串生成器的情況下創建影像標題,并嘗試以不同方式將標題寫入流。嘗試不同的編碼來轉換位元組也沒有成功。效果是一樣的...
uj5u.com熱心網友回復:
我猜你的問題是由作業系統之間的行尾不一致引起的。當您使用AppendLine它時,它會在您的字串之后添加一個\n字符,該字符會以不同的方式轉換為二進制檔案,具體取決于您運行的作業系統。我建議你像這樣直接寫一行結尾:
builder.Append((char)10);
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/533797.html
標籤:C#图片文件流
上一篇:Asyncio:如何同時在另一個任務中運行一個任務?
下一篇:影像未顯示在字母的html布局中
