WriteableBitmap.PixelBuffer 屬性
定義
重要
部分資訊涉及發行前產品,在發行之前可能會有大幅修改。 Microsoft 對此處提供的資訊,不做任何明確或隱含的瑕疵擔保。
取得直接緩衝區的存取權,其中 寫入 WriteableBitmap 的每個圖元。
public:
property IBuffer ^ PixelBuffer { IBuffer ^ get(); };
IBuffer PixelBuffer();
public IBuffer PixelBuffer { get; }
var iBuffer = writeableBitmap.pixelBuffer;
Public ReadOnly Property PixelBuffer As IBuffer
屬性值
圖元緩衝區的參考。
範例
此程式碼範例會使用WriteableBitmap的PixelBuffer屬性來寫入其圖元內容。
C# 範例來自較大的程式碼範例—SDK XAML 映射範例。 顯示的 C# 程式碼是轉碼案例的一部分,最終會使用 WriteableBitmap 作為 Image.Source 值,並顯示影像。
其他語言中的範例範圍和/或獨立式稍微多一些。
using (IRandomAccessStream fileStream = await file.OpenAsync(Windows.Storage.FileAccessMode.Read))
{
BitmapDecoder decoder = await BitmapDecoder.CreateAsync(fileStream);
// Scale image to appropriate size
BitmapTransform transform = new BitmapTransform() {
ScaledWidth = Convert.ToUInt32(Scenario4WriteableBitmap.PixelWidth),
ScaledHeight = Convert.ToUInt32(Scenario4WriteableBitmap.PixelHeight)
};
PixelDataProvider pixelData = await decoder.GetPixelDataAsync(
BitmapPixelFormat.Bgra8, // WriteableBitmap uses BGRA format
BitmapAlphaMode.Straight,
transform,
ExifOrientationMode.IgnoreExifOrientation, // This sample ignores Exif orientation
ColorManagementMode.DoNotColorManage
);
// An array containing the decoded image data, which could be modified before being displayed
byte[] sourcePixels = pixelData.DetachPixelData();
// Open a stream to copy the image contents to the WriteableBitmap's pixel buffer
using (Stream stream = Scenario4WriteableBitmap.PixelBuffer.AsStream())
{
await stream.WriteAsync(sourcePixels, 0, sourcePixels.Length);
}
}
// You'll need to add the Pictures Library capability to your Package.appxmanifest file.
// MainPage.xaml
...
<Image x:Name="anyExampleImage" Width="100" Height="100"/>
...
// pch.h
...
#include <winrt/Windows.Graphics.Imaging.h>
#include <winrt/Windows.Storage.Streams.h>
#include <winrt/Windows.UI.Xaml.Media.Imaging.h>
struct __declspec(uuid("905a0fef-bc53-11df-8c49-001e4fc686da")) IBufferByteAccess : ::IUnknown
{
virtual HRESULT __stdcall Buffer(uint8_t** value) = 0;
};
...
// MainPage.h
...
struct MainPage : MainPageT<MainPage>
{
...
Windows::Foundation::IAsyncAction ClickHandler(Windows::Foundation::IInspectable const&, Windows::UI::Xaml::RoutedEventArgs const&);
private:
Windows::UI::Xaml::Media::Imaging::WriteableBitmap m_writeableBitmap{ nullptr };
};
...
// MainPage.cpp
...
Windows::Foundation::IAsyncAction MainPage::ClickHandler(IInspectable const&, RoutedEventArgs const&)
{
uint32_t scaledSize = 100;
m_writeableBitmap = Windows::UI::Xaml::Media::Imaging::WriteableBitmap(scaledSize, scaledSize);
Windows::Storage::StorageFolder picturesFolder{ Windows::Storage::KnownFolders::PicturesLibrary() };
auto anyExampleImageFile{ co_await picturesFolder.GetFileAsync(L"anyexampleimage.png") };
Windows::Storage::Streams::IRandomAccessStream fileStream{ co_await anyExampleImageFile.OpenAsync(Windows::Storage::FileAccessMode::Read) };
auto decoder{ co_await Windows::Graphics::Imaging::BitmapDecoder::CreateAsync(fileStream) };
// Scale the image to the appropriate size.
Windows::Graphics::Imaging::BitmapTransform transform;
transform.ScaledWidth(scaledSize);
transform.ScaledHeight(scaledSize);
Windows::Graphics::Imaging::PixelDataProvider pixelData{ co_await decoder.GetPixelDataAsync(
Windows::Graphics::Imaging::BitmapPixelFormat::Bgra8, // WriteableBitmap uses BGRA format
Windows::Graphics::Imaging::BitmapAlphaMode::Straight,
transform,
Windows::Graphics::Imaging::ExifOrientationMode::IgnoreExifOrientation, // This sample ignores Exif orientation
Windows::Graphics::Imaging::ColorManagementMode::DoNotColorManage
) };
// An array containing the decoded image data, which could be modified before being displayed
winrt::com_array<uint8_t> sourcePixels{ pixelData.DetachPixelData() };
// COMMENT OUT EXACTLY ONE OF TECHNIQUE 1/2
// TECHNIQUE 1; QI for IBufferByteAccess.
auto bufferByteAccess{ m_writeableBitmap.PixelBuffer().as<::IBufferByteAccess>() };
uint8_t * pTargetBytes{ nullptr };
bufferByteAccess->Buffer(&pTargetBytes);
// TECHNIQUE 2; use a C++/WinRT helper function (and delete the definition of IBufferByteAccess in pch.h).
//uint8_t * pTargetBytes{ m_writeableBitmap.PixelBuffer().data() };
for (auto & element : sourcePixels)
{
*(pTargetBytes++) = element;
}
anyExampleImage().Source(m_writeableBitmap);
}
...
// pch.h
...
#include <robuffer.h>
...
// MainPage.xaml.cpp
auto writeableBitmap{ ref new Windows::UI::Xaml::Media::Imaging::WriteableBitmap(100, 100) };
::IUnknown* pUnk{ reinterpret_cast<IUnknown*>(writeableBitmap->PixelBuffer) };
Microsoft::WRL::ComPtr<Windows::Storage::Streams::IBufferByteAccess> bufferByteAccess;
HRESULT hr{ pUnk->QueryInterface(IID_PPV_ARGS(&bufferByteAccess)) };
byte *pBuffer{ nullptr };
bufferByteAccess->Buffer(&pBuffer);
// Now, write into the WriteableBitmap by using pBuffer. For example, make the first pixel red.
*pBuffer = 0xFF; ++pBuffer;
*pBuffer = 0xFF; ++pBuffer;
*pBuffer = 0x0; ++pBuffer;
*pBuffer = 0x0;
備註
注意
使用 語言 選擇器 (靠近標題) ,為程式碼範例選擇程式設計語言。
PixelBuffer傳回的IBuffer無法直接寫入。 但是,您可以使用語言特定的技術來寫入緩衝區中的基礎圖元內容。
- 若要從 C# 或 Microsoft Visual Basic 存取圖元內容,您可以使用 WindowsRuntimeBufferExtensions.AsStream 方法來 存取基礎緩衝區做為資料流程。 這會顯示在 C# 程式碼範例中。
- 若要從 C++/WinRT 存取圖元內容,您有三個替代方案。 只要您不是
using namespace winrt;
,您就可以包含 SDK 標頭檔robuffer.h
,以帶入 IBufferByteAccess COM 介面的定義。 不過,由於using namespace winrt;
非常常見,因此您也可以在專案中的一個位置定義 IBufferByteAccess 介面, (請參閱 C++/WinRT 程式碼範例,以查看) 的方式。 定義IBufferByteAccess之後,您可以使用這兩種技術之一來查詢PixelBuffer,以取得 IBufferByteAccess的實例。 然後呼叫 IBufferByteAccess::Buffer 方法 ,以擷取代表圖元內容的位元組緩衝區指標。 這會顯示在 C++/WinRT 程式碼範例中。 C++/WinRT 程式碼範例中也會顯示第三個替代 (,) 是藉由uint8_t*
擷取可從您可以使用 呼叫WriteableBitmap.PixelBuffer().data()
的 Helper 函式傳回的 ,以避免使用IBufferByteAccess。 - 若要從 C++/CX 存取圖元內容,您可以查詢IBufferByteAccess 介面的PixelBuffer,這是 COM 介面。 包含
robuffer.h
。 然後,您可以呼叫 IBufferByteAccess::Buffer 方法 ,以擷取代表圖元內容的位元組緩衝區指標。 這會顯示在 C++/CX 程式碼範例中。