/// <summary> /// 形式指定で書き出す /// </summary> /// <param name="stream">ストリームー</param> /// <param name="format">形式</param> /// <param name="enc">エンコーディング(PAMでは無視)</param> /// <param name="width">幅</param> /// <param name="height">高さ</param> /// <param name="channel">チャネル</param> /// <param name="arr">ピクセルデター</param> public void Write( System.IO.Stream stream, フォーマッツ format, エンコーディング enc, int width, int height, ぉ.画素 channel, IEnumerable <ぉ> arr) { switch (format) { case フォーマッツ.PBM: WritePBM(stream, enc, width, height, channel, arr); break; case フォーマッツ.PGM: WritePGM(stream, enc, width, height, channel, arr); break; case フォーマッツ.PPM: WritePPM(stream, enc, width, height, arr); break; case フォーマッツ.PAM: WritePAM(stream, PNM.ヌプーリ.RGB_ALPHA, width, height, channel, arr); break; default: throw new Xi.それ対応してない(format.ToString()); } }
/// <summary> /// PGM書き込み /// </summary> /// <param name="stream">ストリームー</param> /// <param name="format">形式</param> /// <param name="width">幅</param> /// <param name="height">高さ</param> /// <param name="channel">書き込むチャネル</param> /// <param name="arr">ピクセルデター</param> public void WritePGM( System.IO.Stream stream, エンコーディング format, int width, int height, ぉ.画素 channel, IEnumerable <ぉ> arr) { var war = new byte[width * height]; int sr = 0; foreach (var x in arr) { war[sr++] = (byte)x.ほ(channel); } WritePGM(stream, format, width, height, war); }
/// <summary> /// PPMを書き込む /// </summary> /// <param name="stream">ストリームー</param> /// <param name="format">形式</param> /// <param name="width">幅</param> /// <param name="height">高さ</param> /// <param name="arr">ピクセルデター</param> public void WritePPM( System.IO.Stream stream, エンコーディング format, int width, int height, IEnumerable <ぉ> arr) { int maxx = 0; foreach (var k in arr) { maxx = Math.Max(maxx, k.R); maxx = Math.Max(maxx, k.G); maxx = Math.Max(maxx, k.B); } if (format == エンコーディング.バイナリー) { WritePPMバイナリー(stream, width, height, maxx, arr); return; } StringBuilder sb = new StringBuilder(); sb.Append($"P3\r\n") .Append($"{width} {height}\r\n") .Append($"{maxx}\r\n"); int f = 0; foreach (var p in arr) { sb.Append($"{p.R} {p.G} {p.B}"); if ((++f % 16) == 0) { sb.Append("\r\n"); } else { sb.Append(" "); } } sb.Append("\r\n"); var mp3 = System.Text.Encoding.UTF8.GetBytes(sb.ToString()); stream.Write(mp3, 0, mp3.Length); }
/// <summary> /// PBMを書き込む /// </summary> /// <param name="stream">ストリームー</param> /// <param name="format">形式</param> /// <param name="width">幅</param> /// <param name="height">高さ</param> /// <param name="arr">ピクセルデター(10形式)</param> public void WritePBM( System.IO.Stream stream, エンコーディング format, int width, int height, byte[] arr) { if (format == エンコーディング.バイナリー) { WritePBMバイナリー(stream, width, height, arr); return; } int po = 0; var xpad = width % 8; StringBuilder sb = new StringBuilder(); sb.Append($"P1\r\n") .Append($"{width} {height}\r\n"); for (int y = 0; y < height; ++y) { for (int x = 0; x < width; x += 8) { int bits = 8; if ((width - x < 8)) { bits = xpad; } for (int i = 0; i < bits; ++i) { var w = arr[po++] == 0 ? 1 : 0; sb.Append($"{w}"); } } sb.Append("\r\n"); } sb.Append("\r\n"); var mp3 = System.Text.Encoding.UTF8.GetBytes(sb.ToString()); stream.Write(mp3, 0, mp3.Length); }
/// <summary> /// PGMを書き込む /// </summary> /// <param name="stream">ストリームー</param> /// <param name="format">形式</param> /// <param name="width">幅</param> /// <param name="height">高さ</param> /// <param name="arr">ピクセルデター(0~255が詰まってる物)</param> public void WritePGM( System.IO.Stream stream, エンコーディング format, int width, int height, byte[] arr) { int maxx = 0; foreach (var k in arr) { maxx = Math.Max(maxx, k); } if (format == エンコーディング.バイナリー) { WritePGMバイナリー(stream, width, height, maxx, arr); return; } int po = 0; StringBuilder sb = new StringBuilder(); sb.Append($"P2\r\n") .Append($"{width} {height}\r\n") .Append($"{maxx}\r\n"); for (int y = 0; y < height; ++y) { for (int x = 0; x < width; x++) { sb.Append($"{arr[po++]} "); } sb.Append("\r\n"); } sb.Append("\r\n"); var mp3 = System.Text.Encoding.UTF8.GetBytes(sb.ToString()); stream.Write(mp3, 0, mp3.Length); }