#1
by annkn.uraneko » 6年前
お世話になります。
初めて投稿させていただきます。
タイトルのとおり、WICでの画像表示で、JPG、PNG等の表示ができているのですが、一定サイズ以上の画像の場合、CreateBitmapFromWicBitmap()でエラーとなります。
1920x1200のJPGファイルは問題なく表示されますが、例えば、400x25000(これ以上も)のJPGファイルはエラーとなります。
何故エラーになるのか、またどうすれば回避できるのか、何かヒントでもいただければ大変ありがたく思います。
プログラムスキルは低く、Direct2DもWICも、基本的な部分を理解できておりません。
あちこちのサンプルソースを参考に、一応現状以下のソースで表示できていますが、何か根本的な間違いがあるかもしれません。
開発環境は、VisualStudi Community2015 VC++です。
以下にソースを記載します。
よろしくお願いします。
コード:
// WICイメージングファクトリー作成
if (FAILED(CoCreateInstance(
CLSID_WICImagingFactory,
NULL,
CLSCTX_INPROC_SERVER,
IID_IWICImagingFactory,
reinterpret_cast<void **>(&m_gImagingFactory)
))
)
{
MessageBox(_T("ImagingFactory作成に失敗"), _T("WICエラー"));
return false;
}
// D2Dファクトリー作成
HRESULT hr = D2D1CreateFactory(D2D1_FACTORY_TYPE_SINGLE_THREADED, &m_gFactory);
if (FAILED(hr))
{
MessageBox(_T("D2Dファクトリ作成に失敗"), _T("WICエラー"));
return false;
}
// }
// HRESULT hr;
// レンダーターゲットの作成
RECT rect;
GetClientRect(&rect);
hr = m_gFactory->CreateHwndRenderTarget(
D2D1::RenderTargetProperties(),
D2D1::HwndRenderTargetProperties(
// hWnd,
this->m_hWnd,
D2D1::Size(
static_cast<UINT>(rect.right - rect.left),
static_cast<UINT>(rect.bottom - rect.top)
)
),
&m_gTarget
);
if (FAILED(hr))
{
MessageBox(_T("レンダーターゲット作成に失敗"), _T("WICエラー"));
return false;
}
// 画像ファイルの読込み
// ファイルからデコーダを作成
// CComPtr<IWICBitmapDecoder> dec;
hr = m_gImagingFactory->CreateDecoderFromFilename(
m_sFileName,
NULL,
GENERIC_READ,
WICDecodeMetadataCacheOnLoad,
&m_gDecoder);
if (FAILED(hr))
{
MessageBox(_T("デコーダー作成に失敗"), _T("WICエラー"));
return false;
}
// フレーム取得
// CComPtr<IWICBitmapFrameDecode> frame;
hr = m_gDecoder->GetFrame(0, &m_gFrameDec);
if (FAILED(hr))
{
MessageBox(_T("フレーム取得に失敗"), _T("WICエラー"));
return false;
}
// コンバータでDirect2D用フォーマットに変換
CComPtr<IWICFormatConverter> converter;
hr = m_gImagingFactory->CreateFormatConverter(&converter);
if (FAILED(hr))
{
MessageBox(_T("Direct2Dフォーマット変換に失敗"), _T("WICエラー"));
return false;
}
hr = converter->Initialize(
m_gFrameDec,
GUID_WICPixelFormat32bppPBGRA,
WICBitmapDitherTypeNone,
NULL,
0.f,
WICBitmapPaletteTypeMedianCut);
if (FAILED(hr))
{
MessageBox(_T("Direct2Dフォーマット変換に失敗"), _T("WICエラー"));
return false;
}
// 一定サイズ以上の画像の場合、以下のCreateBitmapFromWicBitmap()でエラーとなる。
// Direct2D用ビットマップを作成
hr = m_gTarget->CreateBitmapFromWicBitmap(converter, NULL, &m_gBitmap);
if (FAILED(hr))
{
MessageBox(_T("Direct2Dビットマップ作成に失敗"), _T("WICエラー"));
return false;
}
お世話になります。
初めて投稿させていただきます。
タイトルのとおり、WICでの画像表示で、JPG、PNG等の表示ができているのですが、一定サイズ以上の画像の場合、CreateBitmapFromWicBitmap()でエラーとなります。
1920x1200のJPGファイルは問題なく表示されますが、例えば、400x25000(これ以上も)のJPGファイルはエラーとなります。
何故エラーになるのか、またどうすれば回避できるのか、何かヒントでもいただければ大変ありがたく思います。
プログラムスキルは低く、Direct2DもWICも、基本的な部分を理解できておりません。
あちこちのサンプルソースを参考に、一応現状以下のソースで表示できていますが、何か根本的な間違いがあるかもしれません。
開発環境は、VisualStudi Community2015 VC++です。
以下にソースを記載します。
よろしくお願いします。
[code]
// WICイメージングファクトリー作成
if (FAILED(CoCreateInstance(
CLSID_WICImagingFactory,
NULL,
CLSCTX_INPROC_SERVER,
IID_IWICImagingFactory,
reinterpret_cast<void **>(&m_gImagingFactory)
))
)
{
MessageBox(_T("ImagingFactory作成に失敗"), _T("WICエラー"));
return false;
}
// D2Dファクトリー作成
HRESULT hr = D2D1CreateFactory(D2D1_FACTORY_TYPE_SINGLE_THREADED, &m_gFactory);
if (FAILED(hr))
{
MessageBox(_T("D2Dファクトリ作成に失敗"), _T("WICエラー"));
return false;
}
// }
// HRESULT hr;
// レンダーターゲットの作成
RECT rect;
GetClientRect(&rect);
hr = m_gFactory->CreateHwndRenderTarget(
D2D1::RenderTargetProperties(),
D2D1::HwndRenderTargetProperties(
// hWnd,
this->m_hWnd,
D2D1::Size(
static_cast<UINT>(rect.right - rect.left),
static_cast<UINT>(rect.bottom - rect.top)
)
),
&m_gTarget
);
if (FAILED(hr))
{
MessageBox(_T("レンダーターゲット作成に失敗"), _T("WICエラー"));
return false;
}
// 画像ファイルの読込み
// ファイルからデコーダを作成
// CComPtr<IWICBitmapDecoder> dec;
hr = m_gImagingFactory->CreateDecoderFromFilename(
m_sFileName,
NULL,
GENERIC_READ,
WICDecodeMetadataCacheOnLoad,
&m_gDecoder);
if (FAILED(hr))
{
MessageBox(_T("デコーダー作成に失敗"), _T("WICエラー"));
return false;
}
// フレーム取得
// CComPtr<IWICBitmapFrameDecode> frame;
hr = m_gDecoder->GetFrame(0, &m_gFrameDec);
if (FAILED(hr))
{
MessageBox(_T("フレーム取得に失敗"), _T("WICエラー"));
return false;
}
// コンバータでDirect2D用フォーマットに変換
CComPtr<IWICFormatConverter> converter;
hr = m_gImagingFactory->CreateFormatConverter(&converter);
if (FAILED(hr))
{
MessageBox(_T("Direct2Dフォーマット変換に失敗"), _T("WICエラー"));
return false;
}
hr = converter->Initialize(
m_gFrameDec,
GUID_WICPixelFormat32bppPBGRA,
WICBitmapDitherTypeNone,
NULL,
0.f,
WICBitmapPaletteTypeMedianCut);
if (FAILED(hr))
{
MessageBox(_T("Direct2Dフォーマット変換に失敗"), _T("WICエラー"));
return false;
}
// 一定サイズ以上の画像の場合、以下のCreateBitmapFromWicBitmap()でエラーとなる。
// Direct2D用ビットマップを作成
hr = m_gTarget->CreateBitmapFromWicBitmap(converter, NULL, &m_gBitmap);
if (FAILED(hr))
{
MessageBox(_T("Direct2Dビットマップ作成に失敗"), _T("WICエラー"));
return false;
}
[/code]