从UWP vc ++中生成的字节数组生成图像

时间:2018-01-17 04:00:03

标签: c++ windows visual-c++ uwp windows-store-apps

参考此Question&通过@Decade Moon回答 我如何使用该方法从字节数组而不是图像文件生成图像。
我尝试下面但没有任何作用。没有显示图像

std::vector<char> data= std::vector<char>(imgx->Height * imgx->Width * 4);
    int offset;
    for (int row = 0; row < imgx->Height; row++)
    {
        for (int col = 0; col < imgx->Width; col++)
        {
            offset = (row * (int)(imgx->Width * 4)) + (col * 4);
            data[offset] = 0x58;      // Red
            data[offset + 1] = 0x58;  // Green
            data[offset + 2] = 0x58;  // Blue
            data[offset + 3] = 0x58;  // Alpha
        }
    };

1 个答案:

答案 0 :(得分:3)

我的方法与您提到的回复略有不同,但效果非常好。

#include <wrl.h>  
#include <robuffer.h>

using namespace Windows::UI::Xaml::Media::Imaging;
using namespace Windows::Storage::Streams;  
using namespace Microsoft::WRL;  

typedef uint8 byte;
byte* GetPointerToPixelData(IBuffer^ pixelBuffer, unsigned int *length)  
{  
    if (length != nullptr)  
    {  
        *length = pixelBuffer ->Length;  
    }  
    // Query the IBufferByteAccess interface.  
    ComPtr<IBufferByteAccess> bufferByteAccess;  
    reinterpret_cast<IInspectable*>(pixelBuffer)->QueryInterface(IID_PPV_ARGS(&bufferByteAccess));  

    // Retrieve the buffer data.  
    byte* pixels = nullptr;  
    bufferByteAccess->Buffer(&pixels);  
    return pixels;  
}

MainPage::MainPage()
{
    InitializeComponent();

    auto bitmap = ref new WriteableBitmap(50, 50);
    image->Source = bitmap;

    unsigned int length;
    byte* sourcePixels = GetPointerToPixelData(bitmap->PixelBuffer, &length);  
    const unsigned int width = bitmap->PixelWidth;  
    const unsigned int height = bitmap->PixelHeight; 

    create_async([this, width, height, sourcePixels] {
        byte* temp = sourcePixels;  

        // generate RED - BLUE gradient
        for(unsigned int k = 0; k < height; k++) {
            for (unsigned int i = 0; i < (width * 4); i += 4) {
                int pos = k * (width * 4) + (i);  
                temp[pos] = (byte)(0xFF * k / (float)height);               // B
                temp[pos + 1] = 0x0;                                        // G
                temp[pos + 2] = 0xFF - (byte)(0xFF * k / (float)height);    // R
                temp[pos + 3] = 0xFF;                                       // A
            }  
        }
    });
}

enter image description here