在我的应用程序中保存Windows上的PNM图像的问题



我正在为我的c#项目创建一个照片编辑应用程序。我需要支持不同的图像格式,但首先,我选择了一种非常简单的格式——PNM。目前,我可以打开PNM图像并更改配色方案,但在保存时发生了奇怪的事情。当在macOS上保存图像时,一切都很好,但在Windows上尝试了类似的操作后,我得到了一个奇怪的效果,保存后每个新打开的颜色都以1字节的位移读取。

下面是一个图片的例子:示例图片

这就是在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);
}

我尝试在没有字符串生成器的情况下创建图像的标题,并尝试以不同的方式将标题写入流。尝试不同的编码来转换字节也没有成功。效果是一样的…

我猜你的问题是由操作系统之间不一致的行结尾引起的。当你使用AppendLine时,它会在你的字符串后面添加一个n字符,根据你运行的操作系统,它会以不同的方式转换为二进制。我建议你这样写:

builder.Append((char)10);

最新更新