์นด๋ฉ๋ผ๋ก๋ถํฐ 16๋นํธ ์ด๋ฏธ์ง ๋ฒํผ๋ฅผ ๋ฐ์์ WPF์ ImageSource๋ก ์ด๋ฏธ์ง๋ฅผ ์ถ๋ ฅํ๋ ์ค์ ๋๋ค.
์ด๋ฐ ๊ธ์ ์ฐ๋๊ฒ ์ต์ํ์ง ์์์โฆ ์์ฑ์ด ์ด์์ง ๋ชปํ์ ์ฃ์กํฉ๋๋ค.
์๋ ๋๋ฌธ์ ํด๋น ๋งํฌ์ ๊ฐ๊ฒ ์์ฑํ์ต๋๋ค.
DisplayImage(ushort[] frame, ushort width, ushort height)
{
System.Windows.Application.Current.Dispatcher.BeginInvoke(new Action(() => AllocImgBuf(width, height)), DispatcherPriority.Normal);
WriteableBitmap buffer = null;
ushort pixelValue = 0;
lock (_bufferLock)
{
if (_lastWritten == _bufferPtr) // ์ด์ ๋ฒํผ๊ฐ ์์ง ์ฌ์ฉ๋์ง ์์๋ค๋ฉด ์คํต
{
return;
}
//๊ณ ์ ๋ ๋ฐฐ์ด๋ก๋ถํฐ ํฌ์ธํฐ ์ป๊ธฐ
GCHandle handle = GCHandle.Alloc(frame, GCHandleType.Pinned);
IntPtr pPixelData = handle.AddrOfPinnedObject();
CopyMemory(_bufferPtr, pPixelData, (uint)((uint)width * (uint)height * 2));
_lastWritten = _bufferPtr;
buffer = _freeBuffer;
handle.Free();
}
System.Windows.Application.Current.Dispatcher.BeginInvoke(new Action(() => SwitchBuffer(buffer)), DispatcherPriority.Render);
}
private void AllocImgBuf(int width, int height)
{
if (_buffer1 == null || ((width * height) != (_buffer1.Width * _buffer1.Height)))
{
_buffer1 = new WriteableBitmap(width, height, 96, 96, PixelFormats.Gray16, null);
_buffer2 = new WriteableBitmap(width, height, 96, 96, PixelFormats.Gray16, null);
_freeBuffer = _buffer2;
_freeBuffer.Lock();
_bufferPtr = _freeBuffer.BackBuffer;
}
}
private void SwitchBuffer(WriteableBitmap buffer)
{
// CountFPS();
ushort pixelValue = 0;
lock (_bufferLock)
{
_freeBuffer = buffer == _buffer2 ? _buffer1 : _buffer2;
_freeBuffer.Lock();
_bufferPtr = _freeBuffer.BackBuffer;
}
buffer.AddDirtyRect(new System.Windows.Int32Rect(0, 0, buffer.PixelWidth, buffer.PixelHeight));
buffer.Unlock();
Image = buffer;
}
Image๋ ObservableProperty๋ก Binding ๋์ด์์ต๋๋ค.
์์ ์ฝ๋๋ก ํ๋ก๊ทธ๋จ์ ์คํํ ๊ฒฝ์ฐ, ์๋์ ์ด๋ฏธ์ง์ ๊ฐ์ด Stride๋ ์ด๋ฏธ์ง ํ์์ด ์๋ชป๋ ๊ฒ์ฒ๋ผ ์ถ๋ ฅ๋ฉ๋๋ค.
// System.Windows.Application.Current.Dispatcher.BeginInvoke(new Action(() => SwitchBuffer(buffer)), DispatcherPriority.Render);
//์์ ์ฝ๋ ๋์ ์
System.Windows.Application.Current.Dispatcher.BeginInvoke((Action)(() =>
{
if (frame is not null && frame.Length != 0)
Image = BitmapSource.Create(width, height, 96, 96, PixelFormats.Gray16, null, frame, width * 2);
else
Image = null;
}));
BackBuffer๋ฅผ Copyํ๋ ๋ฐฉ์์ด ์๋ BitmapSource.Create ๋ฐฉ์์ผ๋ก ํ ๊ฒฝ์ฐ, ์๋์ ์ด๋ฏธ์ง์ ๊ฐ์ด ์ ์์ ์ผ๋ก ๋์ต๋๋ค.
์์ CopyMemory ๋ฐฉ์ ์ดํ, SwitchBuffer ๋ฐฉ์์ด BitmapSource.Create ๋ฐฉ์๊ณผ ๋ค๋ฅด๊ฒ ์ด๋ฏธ์ง๊ฐ ์ด์ํ๊ฒ ๋์ค๋ ์ด์ ๋ฅผ ๋ชจ๋ฅด๊ฒ ์ต๋๋คโฆ ใ ใ โฆ
์ด๊ฒ ์ ๊ฒ ํ์ธํด๋ณธ๋ค๊ณ , ๋ฉ๋ชจ๋ฆฌ ์ฃผ์์ ์๋ ๊ฐ๋ ์ ๋ถ ๊ธ์ด์์ ๋น๊ตํด๋ดค๋๋ฐ ๋๊ฐ์ ๊ฒ์ ํ์ธํ์ต๋๋ค.
์๋๊ฐ ์ค์ํด์ ๊ทธ๋ฐ๋ฐ SwitchBuffer ๋ฐฉ์์ ์ฌ์ฉํ์ ๋ ์ด๋ฏธ์ง๊ฐ ์ ์์ ์ผ๋ก ์ถ๋ ฅ๋ ์ ์๋ ๋ฐฉ๋ฒ์ ์์์์๊น์โฆ