嘗試將 32 位浮點 RGB 影像寫入 pfm 檔案,但不確定如何解釋此解釋。( http://www.pauldebevec.com/Research/HDR/PFM/ )
該格式以指定影像大小和型別的三行文本開始,然后是檔案其余部分的原始二進制影像資料。.pfm 檔案的文本標題采用以下形式:
[type] [xres] [yres] [byte_order] 三行文本中的每一行都以 1 位元組 Unix 樣式的回車符結尾:十六進制的 0x0a,而不是 Windows/DOS CR/LF 組合。“[type]”是 3 通道 RGB 彩色影像的“PF”或單色單通道影像的“Pf”之一。“[xres] [yres]”表示影像的x和y解析度。“[byte_order]”是一個數字,用于指示檔案中的位元組順序。正數(例如“1.0”)表示大端,每個 4 位元組浮點數的最高有效位元組在前。如果數字是負數(例如“-1.0”),這表示小端序,最低有效位元組在前。這些檔案中沒有評論。例如:
PF 768 512 -1.0 表示 RGB 彩色影像,768 x 512 像素,采用 little-endian 位元組順序。
在最后的回車之后,檔案繼續處理每個像素的一系列三個 4 位元組 IEEE 754 單精度浮點數,按從左到右、從下到上的順序指定。
C# 我當前的代碼:
using (var stream = File.Open(path, FileMode.Create))
{
using (var writer = new StreamWriter(stream))
{
writer.Write("PF");
writer.Write((byte)0x0a);
writer.Write(((int)texture.Width).ToString());
writer.Write((byte)0x20);
writer.Write(((int)texture.Height).ToString());
writer.Write((byte)0x0a);
if (BitConverter.IsLittleEndian)
{
writer.Write("-1.0");
}
else
{
writer.Write("1.0");
}
writer.Write((byte)0x0a);
for (int i = 0; i < texture.Length; i )
{
writer.Write((float)texture[i].R));
writer.Write((float)texture[i].G));
writer.Write((float)texture[i].B));
}
}
}
uj5u.com熱心網友回復:
作業版本:
using (var stream = File.Open(path, FileMode.Create))
{
using (var writer = new BinaryWriter(stream))
{
string str = $"PF\n{(int)texture.Width} {(int)texture.Height}\n-1.0\n";
byte[] bytes = Encoding.ASCII.GetBytes(str);
writer.Write(bytes);
for (int i = 0; i < texture.Length; i )
{
writer.Write((float)texture[i].R);
writer.Write((float)texture[i].G);
writer.Write((float)texture[i].B);
}
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/531522.html
標籤:C#图片文件二进制写入器
