WICを使用した画像表示で、一定サイズ以上だとエラーとなる

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
annkn.uraneko

WICを使用した画像表示で、一定サイズ以上だとエラーとなる

#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;
		}


annkn.uraneko

Re: WICを使用した画像表示で、一定サイズ以上だとエラーとなる

#2

投稿記事 by annkn.uraneko » 6年前

お世話になります。

すみません、msdnフォーラムに同じ質問をしたところ、どちらかを閉じるようにとのことでしたので、一応この質問に関してはここで終了とさせてください。

書き込みを削除する方法がわからないため、返信ですみません。
よろしくお願いします。

annkn.uraneko

Re: WICを使用した画像表示で、一定サイズ以上だとエラーとなる

#3

投稿記事 by annkn.uraneko » 6年前

msdnの方で回答がありましたので、質問としては終了させていただきましたが、参考までに簡単に回答内容を載せておきます。

結果としては、ひとつのレンダーターゲットで読み込めるビットマップの最大サイズに制限があるとのことです。
1辺が、ID2D1RenderTarget::GetMaximumBitmapSize() で、取得した値を越えるビットマップは読み込みエラーとなるようです。

よろしくお願いします。

ISLe
記事: 2650
登録日時: 13年前
連絡を取る:

Re: WICを使用した画像表示で、一定サイズ以上だとエラーとなる

#4

投稿記事 by ISLe » 6年前

MSDNの方で回避策は教えてもらえなかったのでしょうか。
D2D1::RenderTargetProperties()が返すパラメータは、ハードウェアが使えるときはハードウェアを使い、ハードウェアが使えないときにソフトウェアを使う、という設定なので、これを、常にソフトウェアを使うように明示すれば、サイズの制限に関しては大幅に緩和できます。

こちらの環境(※)では、ソフトウェアを使うように明示することで、ID2D1RenderTarget::GetMaximumBitmapSize()の戻り値が、16384 → 8388608 に変化しました。
※Windows 10 bit、6GBメモリ、GeForce GTX 1050 Ti

コード:

		// レンダーターゲットの作成
		RECT rect;
		GetClientRect(&rect);
                auto render_target_properties = D2D1::RenderTargetProperties(); // ←
                render_target_properties.type = D2D1_RENDER_TARGET_TYPE_SOFTWARE; // ←
		hr = m_gFactory->CreateHwndRenderTarget(
			render_target_properties, // ←
			D2D1::HwndRenderTargetProperties(
			//			hWnd,
			this->m_hWnd,
			D2D1::Size(
			static_cast<UINT>(rect.right - rect.left),
			static_cast<UINT>(rect.bottom - rect.top)
			)
			),
			&m_gTarget
			);

annkn.uraneko

Re: WICを使用した画像表示で、一定サイズ以上だとエラーとなる

#5

投稿記事 by annkn.uraneko » 6年前

ISLe さま

回答ありがとうございます。
ご指示頂いた内容で、無事表示できました!
大変助かりました。

私のところでも、8388608 まで表示できました!

> MSDNの方で回避策は教えてもらえなかったのでしょうか。

画像を分割して読み込んではどうかという提案はいただきましたが、他の回避策はコメントありませんでした。

勉強不足の初心者にご親切な回答、本当にありがとうございます。
感謝いたします。

今後共よろしくお願いします。

返信

“C言語何でも質問掲示板” へ戻る