2017-03-25 7 views
0

Windows Imaging Componentを使用してクリップボードにコピーしたイメージを読み取る機能を作成しようとしています。現在、私のコードはリソースのロード方法に基づいていますが、クリップボードで動作するように変更されています。ストリームを初期化するまでのすべてが正常に機能しますが、一度使用しようとするとCreateDecoderFromeStreamは失敗します。私は無数の場所から画像をコピーしようとしました。 WICで読み取れないコピーされた画像形式の違いはありますか?WICでクリップボードを読み取る

はここ

が返されたストリームを使用してクリップボード

他の場所コードで
COMStreamSPtr WIC::createStreamFromClipboard() { 
    IStream* ipStream = NULL; 
    COMStreamSPtr stream = nullptr; 
    CoInitialize(nullptr); 
    if (!IsClipboardFormatAvailable(CF_BITMAP) && !IsClipboardFormatAvailable(CF_DIB) && !IsClipboardFormatAvailable(CF_DIBV5)) 
     goto Return; 

    if (!OpenClipboard(NULL)) 
     goto Return; 

    // Load the clipboard 
    HGLOBAL hMem = GetClipboardData(CF_BITMAP); 
    if (hMem == NULL || hMem == INVALID_HANDLE_VALUE) 
     hMem = GetClipboardData(CF_DIB); 
    if (hMem == NULL || hMem == INVALID_HANDLE_VALUE) 
     hMem = GetClipboardData(CF_DIBV5); 
    if (hMem == NULL || hMem == INVALID_HANDLE_VALUE) 
     goto CloseClipboard; 

    // Lock the clipboard, getting a pointer to its data 
    LPVOID pvSourceClipboardData = GlobalLock(hMem); 
    if (pvSourceClipboardData == NULL) 
     goto CloseClipboard; 

    // Read the clipboard data size 
    DWORD dwClipboardSize = GlobalSize(hMem); 
    if (dwClipboardSize == 0) 
     goto GlobalUnlock; 

    // Allocate memory to hold the clipboard data 
    HGLOBAL hgblClipboardData = GlobalAlloc(GMEM_MOVEABLE, dwClipboardSize); 
    if (hgblClipboardData == NULL) 
     goto GlobalUnlock; 

    // Get a pointer to the allocated memory 
    LPVOID pvClipboardData = GlobalLock(hgblClipboardData); 
    if (pvClipboardData == NULL) 
     goto FreeData; 

    // Copy the data from the clipboard to the new memory block 
    CopyMemory(pvClipboardData, pvSourceClipboardData, dwClipboardSize); 
    GlobalUnlock(hgblClipboardData); 

    // Create a stream on the HGLOBAL containing the data 
    if (SUCCEEDED(CreateStreamOnHGlobal(hgblClipboardData, TRUE, &ipStream))) { 
     stream = std::make_shared<COMStream>(ipStream); 
     goto CloseClipboard; 
    } 

FreeData: 
    // Couldn't create stream; free the memory 
    GlobalFree(hgblClipboardData); 
GlobalUnlock: 
    // Unlock the clipboard data 
    GlobalUnlock(hMem); 
CloseClipboard: 
    // Close the clipboard 
    CloseClipboard(); 
Return: 
    // No need to unlock or free the resource 
    CoUninitialize(); // CoInialize is called by my COMObjects in the constructor so this is just decrementing the count. 
    return stream; 
} 

から読み取るためのメモリオブジェクトを作成しています...以下の私のコードです。

WICBitmapDecoderSPtr WIC::createDecoderFromStream(COMStreamSPtr stream) { 
    if (isCOMObjectNull(stream)) 
     return nullptr; 

    IWICImagingFactory* ipFactory = NULL; 
    IWICBitmapDecoder* ipDecoder = NULL; 
    WICBitmapDecoderSPtr decoder = nullptr; 

    // Create the factory 
    if (FAILED(CoCreateInstance(CLSID_WICImagingFactory, NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&ipFactory)))) 
     goto Return; 

    // Create the decoder 
    if (FAILED(ipFactory->CreateDecoderFromStream(stream->ipObject, NULL, WICDecodeMetadataCacheOnDemand, &ipDecoder))) 
     goto ReleaseFactory; // FAILS HERE 

    decoder = std::make_shared<WICBitmapDecoder>(ipDecoder); 
ReleaseFactory: 
    ipFactory->Release(); 
Return: 
    return decoder; 
} 

答えて

0

私はついにこのことを理解しました。私がしたのは、IWICImagingFactoryCreateBitmapFromHBITMAPの機能を使用したことです。クリップボードからHBITMAPを読むのは簡単ではないので、解決策はかなり簡単になります。

IWICBitmapSource* WIC::readSourceFromClipboard() { 
    IWICBitmapSource* ipSource = NULL; 
    if (Clipboard::containsFormat(CF_BITMAP)) { 
     if (OpenClipboard(NULL)) { 
      HBITMAP hBitmap = (HBITMAP)GetClipboardData(CF_BITMAP); 
      ipSource = createSourceFromHBitmap(hBitmap); 
      CloseClipboard(); 
     } 
    } 
    return ipSource; 
} 

IWICBitmapSource* WIC::createSourceFromHBitmap(HBITMAP hBitmap) { 
    if (hBitmap == NULL) 
     return NULL; 

    IWICImagingFactory* ipFactory = NULL; 
    IWICBitmap* ipBitmap = NULL; 

    CoInitialize(NULL); 

    // Create the factory 
    if (FAILED(CoCreateInstance(CLSID_WICImagingFactory, NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&ipFactory)))) 
     goto Return; 

    // Create the bitmap 
    if (FAILED(ipFactory->CreateBitmapFromHBITMAP(hBitmap, NULL, WICBitmapIgnoreAlpha, &ipBitmap))) 
     goto ReleaseFactory; 

ReleaseFactory: 
    ipFactory->Release(); 
Return: 
    CoUninitialize(); 
    return ipBitmap; 
} 
関連する問題