Universal Windows App에서 .pgm 이미지를 표시해야합니다. XAML 이미지 컨트롤은 .pgm 이미지를 직접 지원하지 않으므로이를 해결해야합니다.Universal Windows App (C#, XAML)에서 Portable Graymap (PGM) 이미지 표시
인터넷에서 C#으로 .pgm 파일을 여는 많은 예제가 있지만이 모든 것은 Universal Windows 플랫폼에서 지원되지 않는 Bitmap 개체를 사용합니다 (System.Drawing 및 System.Windows.Media 라이브러리는 지원되지 않습니다). 사용).
이미지 너비와 높이를 읽고 바이트 배열의 픽셀 (회색 음영을 나타내는 0-255 값 포함)을 읽는 코드가 있습니다.
다음 단계는 결국 XAML Image.Source에 전달 될 수있는 모든 개체를 사용하여 바이트 [] 배열에서 이미지를 그립니다 (적절한 시간 내에 수행).
내가하고 관리하는 가장 좋은
이 this 을 표시했지만 실제 사진이 this처럼 보이도록되어있다 (어떤 이유로 이미지 배를 보여주고 색상이 잘못).내가 사용하는 코드 :
public int width;
public int height;
public int maxVal; //255
public byte[] pixels;
public async Task<WriteableBitmap> ToWriteableBitmap()
{
WriteableBitmap writeableBitmap = new WriteableBitmap(width, height);
using (Stream stream = writeableBitmap.PixelBuffer.AsStream())
{
await stream.WriteAsync(pixels, 0, pixels.Length);
}
return writeableBitmap;
}
그것을 나는 또한 내가 PgmImage 개체에 .pgm 파일을 읽기 위해 사용하는 코드를 제공하고있어,하지만 난이 잘 작동 확실 해요, 문제가해야 :
public static async Task<PgmImage> LoadFromFile(string file)
{
FileStream ifs = null;
await Task.Run(() =>
{
Task.Yield();
ifs = new FileStream(file, FileMode.Open, FileAccess.Read);
});
BinaryReader br = new BinaryReader(ifs);
string magic = NextNonCommentLine(br);
//if (magic != "P5")
// throw new Exception("Unknown magic number: " + magic);
string widthHeight = NextNonCommentLine(br);
string[] tokens = widthHeight.Split(' ');
int width = int.Parse(tokens[0]);
int height = int.Parse(tokens[1]);
string sMaxVal = NextNonCommentLine(br);
int maxVal = int.Parse(sMaxVal);
byte[] pixels = new byte[height * width];
for (int i = 0; i < height * width; i++)
{
pixels[i] = br.ReadByte();
}
return new PgmImage(width, height, maxVal, pixels);
}
static string NextAnyLine(BinaryReader br)
{
string s = "";
byte b = 0; // dummy
while (b != 10) // newline
{
b = br.ReadByte();
char c = (char)b;
s += c;
}
return s.Trim();
}
static string NextNonCommentLine(BinaryReader br)
{
string s = NextAnyLine(br);
while (s.StartsWith("#") || s == "")
s = NextAnyLine(br);
return s;
}
(이것은이의 약간 편집 된 버전입니다 : jamesmccaffrey.wordpress.com/2014/10/21/a-pgm-image-viewer-using-c). 타사 라이브러리 또는 NuGet 패키지에 의존하지 않는 솔루션을 선호한다고 언급해야하지만 필자는 필사적이어서 모든 솔루션을 공개합니다.
귀하의 빠르고 자세한 답변을 주셔서 감사합니다. BGRA 인코딩에 맞게 바이트 []를 확장하여 내 솔루션을 발견했습니다. 답변으로 코드를 게시했습니다. 어쩌면 누군가가 유용 할 것입니다. – zvjeverica