
どなたか経験のある方、わかる方居られましたら教えてください。
プリンタのデバイスコンテキストからメモリDCに描画してビットマップを作成したいと思っているのですが、プリンタDCからメモリDCへのBitBltがうまくいっていないのか、完成イメージが真っ黒になります。
hMemDC = CreateCompatibleDC(hPrinterDC);
hBitmap = CreateCompatibleBitmap(hPrinterDC,lnWidth,lnHeight);
Obj = (HBITMAP)SelectObject(hMemDC,hBitmap);
iRet = GetDeviceCaps(hMemDC,RASTERCAPS);
// iRet の戻り値は 28313(10進)でした。
// コピー
iRet = BitBlt(hMemDC,0,0,lnWidth,lnHeight,hPrinterDC,0,0,SRCCOPY);
// iRet の戻り値は 1 になってました。
本来は lnHeight の値が BitBlt の戻り値になるのかと思いますがうまくいきません。
hPrinterDC はもともと印刷用の関数で使用しているものなので、そこには問題が無いのではないかと自分では思っていますが、わかる方居られましたら教えていただけませんでしょうか?
No.1ベストアンサー
- 回答日時:
★Toyochan8 さんへ
・随分と苦戦していますね。
・過去に同じような質問を 3 つしていますが、解決していないようですね。
・私は『プリンタ・デバイス』を操作した経験はありませんが、気になった点を4つアドバイスします。
●1つ目
・まず『BitBlt』の戻り値ですが、MSDN のマニュアルでは BOOL 型になっていて正常終了すると TRUE を
返します。エラーが起きた場合は FALSE を返します。→『lnHeight』の値は戻り値に戻りません。
●2つ目
・GetDeviceCaps の行は、
『iRet = GetDeviceCaps(hMemDC,(RASTERCAPS|RC_BITBLT));』と
『iRet = GetDeviceCaps(hPrinterDC,(RASTERCAPS|RC_BITBLT));』の
2つを調べます。
戻り値を調べ『if (iRet & RC_BITBLT)』が真ならば BitBlt 関数を利用できます。
●3つ目
・『BitBlt』関数で上手くコピーできないならば、『StretchBlt』関数で長方形をコピーします。
つまり、
『BOOL bRet = StretchBlt(hMemDC,0,0,lnWidth,lnHeight,hPrinterDC,0,0,lnWidth,lnHeight,SRCCOPY);』
として転送します。このとき、StretchBlt 関数をサポートしているかどうかを
『iRet = GetDeviceCaps(hMemDC,(RASTERCAPS|RC_STRETCHBLT));』と
『iRet = GetDeviceCaps(hPrinterDC,(RASTERCAPS|RC_STRETCHBLT));』で
問い合わせます。戻り値を調べ『if (iRet & RC_STRETCHBLT)』が真ならば StretchBlt 関数を利用できます。
●4つ目
・フルカラーならビットマップのヘッダの『biBitCount = 16;』ではなく『biBitCount = 24;』とすべきです。
・さらに横方向のピクセル値は 4 バイト単位で揃えます。→横幅が 125 ピクセルならば、128 ピクセルとして
黒色データを 3 ピクセル余分に出力します。ここに注意して『.bmp』ファイルへ出力します。
・あと分かりやすく『biCompression = BI_RGB;』という定数にしましょう。
最後に:
・一度、メモリDC のビットマップ・データをウインドウへ描画して、コピーが正常かどうかを目で
確認してみて下さい。その後にファイルへビットマップを出力します。
・それとビットマップ・ファイルにパレットは使っていませんよね?もし使っていたら、パレットデータも正しく
出力しないと『真っ黒』になりますよ。→『RGBQUAD』構造体を参照
・あと VC++ Ver.15.1 を使っているようですが、『CreateFile』、『WriteFile』、『CloseHandle』の関数が
使えないのですか?
下に『_lwrite』関数を書き直した部分を載せます。→for文の方が分かりやすいですよ。
lCount = (long)LtpBitmapFH.bfSize - sizeof( BITMAPFILEHEADER );
for ( lBuffCnt = 0 ; lBuffCnt >= lCount ; lBuffCnt++ ){
Liret = _lwrite( hF, &szBuffer[lBuffCnt], 1 );
}
・以上。おわり。
Oh-Orangeさん、アドバイス有り難うございます。
『BitBlt』の戻り値の件は自分がGetDIBitsと勘違いしていました申し訳ありません。
GetDeviceCapsの件ですが教えて頂いたとおり書いてみましたがアクティブウインドウでも戻り値が0でした。自分の使い方まずかったんでしょうか・・。下のように使用しました。
iRet = GetDeviceCaps(hMemDC,(RASTERCAPS|RC_STRETCHBLT));
if (iRet & RC_STRETCHBLT) {
// TRUEの時の処理
ここは通りませんでした。
}
BMPのサイズの横幅は 560 なのでその点は大丈夫だと思います。
仕方なくプリンタのDCは中止してフォームを1つ作成してそこに描画したものをメモリDCにコピーさせることにしました、しかしこれも又うまくいかず・・。真っ黒にはならなかったのですが、フォーム上部の×ボタン、最大、最小化ボタンがあるエリアの左部分のアイコンのあたりが指定サイズのビットマップに拡大されて作成されてしまいました。取得データをフォームに描画しても同じ画像だったのでうまくメモリDCに受け取れていないと思います、有り難うございました。
No.2
- 回答日時:
とりあえず、3つのプリンタデバイスで実験してみました。
プリンタDCに画像を描画した直後に画像を取り出してみましたが、単色のビットマップイメージしか取り出せませんでした。
エプソンPM-890C:黒
PDF:黒
Dellのレーザプリンタ:白
プリンタによっては、画像が取り出せるかもしれませんが、通常はできないと思ったほうがよいと思われます。
ところで、どういう意図でプリンタDCからビットマップを取り出したいのでしょうか?
この回答への補足
tettsuさん、いつもアドバイス有難うございます。
わざわざ試していただき申しわけ有りません感謝します、単色だと取り出せる事もあるんですね。
その場合ヘッダ情報のBitCount を1にすればいいだけなのでしょうか?
通常出来ないと思ったほうが良いということなので、新規フォームを作成してそこに描画したイメージをビットマップにすることにしました。
残された時間も少なくなってきて、少し行き詰まってますがもうちょっと考えてみたいと思います。
プリンタDCから取り出したいと思ったのは印刷用のDLLがあったのでそれの終了時のDCから取り出せば早いのかなと思ったからです。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Illustrator(イラストレーター) アイビスペイント、原稿作成について 1 2023/07/14 03:01
- ノートパソコン 自作にするか、メーカーか、オススメのノートPCをおしえてください。 5 2022/11/29 17:42
- その他(ソフトウェア) F-BASICで計算中の実行が中途で勝手に止まり、大変困っています。 2 2023/03/02 16:15
- PDF AutoCAD図面をPDF fileに変換した際、画像情報やブロック名はわかるのでしょうか。 1 2022/06/03 09:42
- PDF 2つのPDFを重ねる方法はありますか? 4 2023/01/30 14:04
- プリンタ・スキャナー ブラザ-製プリンタ-DCP-J582N不具合改善アドバイス依頼 2 2022/10/17 15:40
- デスクトップパソコン キャプチャーボードDRECAP DC-HC4のドライバー 1 2022/05/30 15:40
- デスクトップパソコン pcが1日に3-4回ほどフリーズするようになりました。 ゲームのプレイや特定のサイト(Twitchな 1 2023/06/16 04:25
- Excel(エクセル) Excelで全クラスのランキング表を作成したい 4 2022/05/24 15:28
- Java Java モンスターブリーダー 1 2023/02/05 09:44
このQ&Aを見た人はこんなQ&Aも見ています
-
今年はじめたいことは?
今年はこれをはじめたい!ということを教えてください!
-
歳とったな〜〜と思ったことは?
歳とったな〜〜〜、老いたな〜〜と思った具体的な瞬間はありますか?
-
最強の防寒、あったか術を教えてください!
とっても寒がりなのですが、冬に皆さんがされている最強の防寒、あったか術が知りたいです!
-
洋服何着持ってますか?
洋服を減らそうと思っているのですが、何着くらいが相場なのかわかりません。
-
集中するためにやっていること
家で仕事をしているのですが、布団をはじめ誘惑だらけでなかなか集中できません。
-
ビットマップを表示させる(MFC)
C言語・C++・C#
-
メモリデバイスコンテキストを用いた描画処理
C言語・C++・C#
-
MFCで画像を表示させているのですが、透過表示する方法がわかりません。
C言語・C++・C#
-
-
4
画面を強制的に再描画させる方法
C言語・C++・C#
-
5
ビットマップ(bmp)形式で背景を透過にできる?
画像編集・動画編集・音楽編集
-
6
MFCでbitmapを背景にしてstaticテキストを透過させる方法
C言語・C++・C#
-
7
MFCプログラミング
C言語・C++・C#
-
8
CString から LPCTSTRの型に変換
C言語・C++・C#
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・一番好きなみそ汁の具材は?
- ・泣きながら食べたご飯の思い出
- ・「これはヤバかったな」という遅刻エピソード
- ・初めて自分の家と他人の家が違う、と意識した時
- ・いちばん失敗した人決定戦
- ・思い出すきっかけは 音楽?におい?景色?
- ・あなたなりのストレス発散方法を教えてください!
- ・もし10億円当たったら何に使いますか?
- ・何回やってもうまくいかないことは?
- ・今年はじめたいことは?
- ・あなたの人生で一番ピンチに陥った瞬間は?
- ・初めて見た映画を教えてください!
- ・今の日本に期待することはなんですか?
- ・集中するためにやっていること
- ・テレビやラジオに出たことがある人、いますか?
- ・【お題】斜め上を行くスキー場にありがちなこと
- ・人生でいちばんスベッた瞬間
- ・コーピングについて教えてください
- ・あなたの「プチ贅沢」はなんですか?
- ・コンビニでおにぎりを買うときのスタメンはどの具?
- ・おすすめの美術館・博物館、教えてください!
- ・【お題】大変な警告
- ・洋服何着持ってますか?
- ・みんなの【マイ・ベスト積読2024】を教えてください。
- ・「これいらなくない?」という慣習、教えてください
- ・今から楽しみな予定はありますか?
- ・AIツールの活用方法を教えて
- ・最強の防寒、あったか術を教えてください!
- ・歳とったな〜〜と思ったことは?
- ・モテ期を経験した方いらっしゃいますか?
- ・好きな人を振り向かせるためにしたこと
- ・スマホに会話を聞かれているな!?と思ったことありますか?
- ・それもChatGPT!?と驚いた使用方法を教えてください
- ・見学に行くとしたら【天国】と【地獄】どっち?
- ・これまでで一番「情けなかったとき」はいつですか?
- ・この人頭いいなと思ったエピソード
- ・あなたの「必」の書き順を教えてください
- ・14歳の自分に衝撃の事実を告げてください
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VC++でUTF-8のファイルを出力し...
-
ファイルの文字コードをUTF-8に...
-
Acccess レポートをグループ別...
-
ファイル出力の場所を指定
-
ファイル形式またはファイル拡...
-
複数のC言語プログラムが,一つ...
-
Accessでのレポート印刷待機方法
-
構造体のファイル出力
-
標準出力とファイルに効率的に...
-
VBAでエクセルをCSVに変換時
-
VC++での外部ファイル(batファ...
-
CBool関数について VB6とVB.net...
-
(VBA)書式が変更されてしまい...
-
CSVファイルを任意の場所に出力...
-
ファイルI/O完了待ち
-
CreateProcess関数と実行後の戻...
-
1行ずつではなくまとめてファイ...
-
CSV形式に変換
-
C言語のプログラムが異常終了し...
-
重複チェックプログラム
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
コマンド(例えばls)の出力結果...
-
VC++でUTF-8のファイルを出力し...
-
ファイル出力の場所を指定
-
シェルコマンドの 2>&1 とはど...
-
【ExcelVBA】UTF-8(BOM無)でC...
-
ファイル形式またはファイル拡...
-
BitBltについて。
-
Wordマクロで指定したフォルダ...
-
外国語とCSVについて
-
Acccess レポートをグループ別...
-
ファイルの文字コードをUTF-8に...
-
テキストファイルに改行コード...
-
MS-Word で作成した表をLatexに...
-
サウンド出力のデバイスを選択...
-
CBool関数について VB6とVB.net...
-
拡張子.vsdをイラストレーター...
-
pLaTeX の EPSファイル読み込み...
-
CSVファイルを任意の場所に出力...
-
pcap形式データをテキストへ抽出
-
VBAでエクセルをCSVに変換時
おすすめ情報