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

    質問

  • お世話になります。
    タイトルのとおり、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イメージングファクトリー作成
    CoCreateInstance(...);
    // D2Dファクトリー作成
    D2D1CreateFactory(...);
    // レンダーターゲットの作成
    m_gFactory->CreateHwndRenderTarget(...);
    // ファイルからデコーダを作成
    m_gImagingFactory->CreateDecoderFromFilename(...);
    // フレーム取得
    m_gDecoder->GetFrame(...);
    // コンバータでDirect2D用フォーマットに変換
    m_gImagingFactory->CreateFormatConverter(&converter);
    converter->Initialize(...);

    // 一定サイズ以上の画像の場合、以下のCreate...でエラーとなる。

    // Direct2D用ビットマップを作成
    m_gTarget->CreateBitmapFromWicBitmap(converter, NULL, &m_gBitmap);

    2018年3月26日 4:35

回答

  • ID2D1RenderTarget::GetMaximumBitmapSize で取得できるビットマップの最大寸法はいくつになっていますでしょうか?この値を超えた幅または高さのビットマップの作成は失敗すると思います。

    ビットマップの作成可能なサイズに JPEG を複数枚に分割し、読み込むようにするのはどうでしょうか?

    • 編集済み kenjinoteMVP 2018年3月26日 5:37
    • 回答としてマーク annkn1957 2018年3月26日 5:55
    2018年3月26日 5:31

すべての返信

  • annkn1957 さん、こんにちは。フォーラム オペレーターの立花です。
    MSDN フォーラムへご投稿くださいましてありがとうございます。

    ご質問内容につきまして、下記フォーラムへも投稿されておりますでしょうか。

    WICを使用した画像表示で、一定サイズ以上だとエラーとなる
    https://dixq.net/forum/viewtopic.php?f=3&p=150299

    複数のフォーラムに同じ投稿をされますと、情報が分散してしまい、
    後から参照した方が、回答にたどり着きにくくなってしまったり、
    参加者の方が折角調べて回答したのに既に別フォーラムで解決済みだった、
    などの状況が生じてしまうことがあります。

    大変恐縮ではございますが、どちらかのご質問を取り下げるなどご検討くださいませ。
    ご理解、ご協力の程、どうぞよろしくお願いいたします。

    画像につきましてはご不便をおかけいたしまして申し訳ありません。
    よろしければ以下の情報をご参照ください。

    本文に画像やリンクを含むことが出来ませんというエラーについて
    https://social.msdn.microsoft.com/Forums/ja-JP/6644446f-8110-48a6-8d95-29050d33b7ae?forum=announceja

    フォーラム利用時の注意点のお知らせです。
    フォーラムでご質問頂くにあたっての注意点
    フォーラムのご利用方法(質問の投稿)について
    フォーラムへの回答に関するガイドラインおよびフォーラム運営について(再掲)
    ご意見、ご要望はこちらのフォーラムまで。
    各種設定方法はフォーラム内を [かんたん フォーラム ガイド] で検索してみてください。


    参考になった投稿には回答としてマークの設定にご協力ください
    MSDN/TechNet Community Support 立花楓

    2018年3月26日 4:58
    モデレータ
  • お世話になります。

    すみません、元々こちらに質問しようとしていたのですが、何度やってもフラグがつけられ確認中と出て投稿できなかったため、ご指摘の外部フォーラムに投稿しました。

    ただ、あちらで回答が得られないようなので、なんとかならないかとこちらに今回の形で書いてみました。

    元々、リンクや画像は含んでいないのですが、ソースがあるせいか投稿できませんでした。

    どうやってもポイントが増えるまで投稿できないのでしょうか?

    初心者には答えられる質問もなく、ポイントを増やす方法がありません。

    とりあえず、外部フォーラムの方を終了します。

    よろしくお願いします。

    2018年3月26日 5:10
  • ID2D1RenderTarget::GetMaximumBitmapSize で取得できるビットマップの最大寸法はいくつになっていますでしょうか?この値を超えた幅または高さのビットマップの作成は失敗すると思います。

    ビットマップの作成可能なサイズに JPEG を複数枚に分割し、読み込むようにするのはどうでしょうか?

    • 編集済み kenjinoteMVP 2018年3月26日 5:37
    • 回答としてマーク annkn1957 2018年3月26日 5:55
    2018年3月26日 5:31
  • annkn1957 さん。フォーラム オペレーターの立花です。
    早々にご返信、およびご検討くださいましてありがとうございます。

    ポイントがなくてもコードは記載いただけるはずなのですが、
    お手数ではございますが、少しお時間を空けて再度
    お試しくださいますようお願いいたします。

    該当のコードは、私にて、ご質問文に追記させていただきますね。
    もし誤りがございましたら、ご指摘くださいますようお願いいたします。

    ご不便、お手数をおかけいたしまして申し訳ありません。


    参考になった投稿には回答としてマークの設定にご協力ください
    MSDN/TechNet Community Support 立花楓

    2018年3月26日 5:46
    モデレータ
  • 前回に引き続き、早速の回答ありがとうございます。

    なるほど、レンダーターゲットには、そういう制約があったんですね・・・。

    ちなみに、私の環境では最大寸法は0x4000となっているようです。

    確かに、高さ16000のフィアルは読めますが、それを越えると読めないようです。

    > ビットマップの作成可能なサイズに JPEG を複数枚に分割し、読み込むようにするのはどうでしょうか?

    これもなかなか今の私にはハードルが高いですが、勉強してみます。

    大変助かりました。

    ありがとうございました。


    2018年3月26日 6:00
  • annkn1957 さん、こんにちは。フォーラム オペレーターの立花です。
    ご確認、およびご返信くださいましてありがとうございます。
    また、ご不便をおかけいたしており申し訳ありません。

    原因につきまして、担当のチームに調査を依頼いたします。

    依頼するにあたりまして、切り分けと、情報のご提供をお願い
    させていただきたいのですが、ご協力いただくことは可能でしょうか。

    私にて新規アカウントを作成して試しましたが、事象が再現せず、
    詳細な状況が分かりませんためご協力をお願いできればと存じます。

    また、本ご投稿の主旨とは異なってまいりますので、コード ブロックが挿入
    できない件については、下記スレッドに分割して対応させていただきます。

    ご依頼事項を記載させていただきましたので、ご協力いただくことが
    可能でございましたらご参照くださいますようお願いいたします。

    コード ブロックの挿入をするとエラーとなる
    https://social.msdn.microsoft.com/Forums/ja-JP/2cef7969-51a1-4513-aa38-fb1606f8cf94/-?forum=suggestja


    参考になった投稿には回答としてマークの設定にご協力ください
    MSDN/TechNet Community Support 立花楓

    2018年3月27日 1:30
    モデレータ