sağlaması koda benzer olmalıdır Microsoft github sayfasında bir örnek olduğunu ilgili olsa da, Windows 10'u hedefleseler de. Bu işlevi elde etmek için projenizi taşımakla ilgilenebilirsiniz.
GetPreviewFrame: Bu örnek, tam olarak üflenmiş fotoğrafların karşısındaki önizleme karelerini yakalayacaktır. Bir önizleme karesi olduğunda, üzerindeki pikselleri düzenleyebilir.
İşte alakalı parçasıdır:
private async Task GetPreviewFrameAsSoftwareBitmapAsync()
{
// Get information about the preview
var previewProperties = _mediaCapture.VideoDeviceController.GetMediaStreamProperties(MediaStreamType.VideoPreview) as VideoEncodingProperties;
// Create the video frame to request a SoftwareBitmap preview frame
var videoFrame = new VideoFrame(BitmapPixelFormat.Bgra8, (int)previewProperties.Width, (int)previewProperties.Height);
// Capture the preview frame
using (var currentFrame = await _mediaCapture.GetPreviewFrameAsync(videoFrame))
{
// Collect the resulting frame
SoftwareBitmap previewFrame = currentFrame.SoftwareBitmap;
// Add a simple green filter effect to the SoftwareBitmap
EditPixels(previewFrame);
}
}
private unsafe void EditPixels(SoftwareBitmap bitmap)
{
// Effect is hard-coded to operate on BGRA8 format only
if (bitmap.BitmapPixelFormat == BitmapPixelFormat.Bgra8)
{
// In BGRA8 format, each pixel is defined by 4 bytes
const int BYTES_PER_PIXEL = 4;
using (var buffer = bitmap.LockBuffer(BitmapBufferAccessMode.ReadWrite))
using (var reference = buffer.CreateReference())
{
// Get a pointer to the pixel buffer
byte* data;
uint capacity;
((IMemoryBufferByteAccess)reference).GetBuffer(out data, out capacity);
// Get information about the BitmapBuffer
var desc = buffer.GetPlaneDescription(0);
// Iterate over all pixels
for (uint row = 0; row < desc.Height; row++)
{
for (uint col = 0; col < desc.Width; col++)
{
// Index of the current pixel in the buffer (defined by the next 4 bytes, BGRA8)
var currPixel = desc.StartIndex + desc.Stride * row + BYTES_PER_PIXEL * col;
// Read the current pixel information into b,g,r channels (leave out alpha channel)
var b = data[currPixel + 0]; // Blue
var g = data[currPixel + 1]; // Green
var r = data[currPixel + 2]; // Red
// Boost the green channel, leave the other two untouched
data[currPixel + 0] = b;
data[currPixel + 1] = (byte)Math.Min(g + 80, 255);
data[currPixel + 2] = r;
}
}
}
}
}
Ve sınıfının dışında bu beyan:
[ComImport]
[Guid("5b0d3235-4dba-4d44-865e-8f1d0e4fd04d")]
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
unsafe interface IMemoryBufferByteAccess
{
void GetBuffer(out byte* buffer, out uint capacity);
}
Ve tabii ki, proje çalışması için tüm bu güvensiz kod izin gerekecektir.
Tüm ayrıntıların nasıl alınacağını görmek için örneğe daha yakından bakın. Ya da, bir izlenim yapmak için, bazı kamera örneklerinde biraz gezinme gerektiren yeni bir // inşa/konferanstan camera session'u izleyebilirsiniz. Eğer 8,1 bağlısın Alternatif
, hangi notify you when there's a new preview frame available can, Lumia Imaging SDK içine bakabilirsiniz.
Zaten sahip olduğum kodu saklamak istedim ve Lumia Imaging SDK kullanmıyordum ama WP 8.1'i de hedeflediğim için kullanıyorum. Teşekkürler – Moucheg
Bu örnek bile 'StartPreviewToCustomSinkAsync' işlevini içermez. Hala nasıl kullanılacağını henüz bilmiyorum. – ThoAppelsin