画像の印刷ですが、1頁に複数の画像を印刷させると
ランダムにどこかの画像が抜け落ちる、ことがある、という現象をずっと
抱えています。
ユーザーには「難しい問題で、抜け落ちてたら再度印刷してね、
2・3回やればちゃんと出ますから」と、ごまかしていたのですけど
最近うるさくなってきて・・・。
扱っている画像はbmp,jpgだけです。画像はなるべく小さくしています。
jpgならこんな感じです。C++なので済みませんが、C++Builder6です。
Jpg->LoadFromFile( FileName );
Bitmap->Assign( Jpg );
Bitmap->Dormant(); ←過去ログからやってみたが効果は不明
Printer()->Canvas->Lock(); ←スレッドじゃないので関係ないかも
Printer()->Canvas->CopyMode = cmSrcCopy;
Printer()->Canvas->CopyRect(MyOther, Bitmap->Canvas, MyRect); とか
Printer()->Canvas->StretchDraw( rR , Bitmap ); して
Printer()->Canvas->Unlock();
過去ログはずっと見たつもりですが、根本原因・解決法などはなかったような気がします。
1ページに1枚画像を印刷するのはまったく問題ありません。
印刷プレビュー機能をつけていて、画面のimageへの書き出しはなどは問題はありません。
PdfDriverなどに書き出すと少々症状が悪くなる、みたいです。
画像の印刷など普通に皆さんやられているかと思いますが、どのようにやられているのでしょうか?
こういう問題は起きていないのでしょうか?
皆々様!、お知恵をよろしくお願いします。
jun さんは書きました:
> お世話様です、じゅんと申します。
>
> 画像の印刷など普通に皆さんやられているかと思いますが、どのようにやられているのでしょうか?
> こういう問題は起きていないのでしょうか?
> 皆々様!、お知恵をよろしくお願いします。
中村さんのサイトの受け売りですが、倍率によっては印刷できないことがあるそうです。
http://www.asahi-net.or.jp/~ha3t-nkmr/tips004.htm
同ページで案内されている TBigBitmap を試されてはいかがでしょうか
私の場合「巨大BMP1つを10倍以上に拡大」だったで非常に助かったのですが、
じゅんさんの場合「小さいのをたくさん」なので外しているかも知れませんけど。
--
松島
Cに直すにはしきいが高く・・・
「中村氏のNkDIBと使うと良い」が見つかり、入れてみようとしてみましたが
導入でつまずいています。
パッケージにNkDIB.pasを入れ、このパッケージを使うようにして、
NkGraph.hpp とNkDIB.hpp のパスを通し、
NkDIB.hpp をインクルードし、#pragma link "nkdib.obj" とそれなりにやってみた
つもりですが、
Graphics::TNkDIB* NkDIB = new Graphics::TNkDIB();
ここで「TNkDIBさんはGraphicsのメンバーではない、型が未定義」と怒られてしまいました。
C++なので申し訳ありませんが、導入手順でまだ何か足りないのでしょうか?
じゅん
TNkDIB* NkDIB = new TNkDIB();
で、良かったようで、失礼しました。
じゅん
松島殿、中村氏 大変ありがとうございます。
この魔法のソースは私には理解不能なのでそのままありがたく使わさせて
頂きます。
...中村氏、早くInprise(でしたっけ今は?)のCEOにでもスカウトされてください!
じゅん
Windows 9X 時代、私の経験ではビットマップの印刷には以下の制限がありました、
1) DIB を使う。
2) DIB形式は 1,4,8,24bpp 非圧縮に限定する。
3) StretchDIBits API を使って印刷する。
4) 一度に印刷するビットマップは紙上(印刷先)で 1024x1024 以下とし、
それより大きいビットマップを印刷するときは StretchDIBits を複数回呼んで、分けて印刷する。
5) DIBの拡大は4倍以下にとどめ、それ以上の拡大が必要な場合は、Scanlineプロパティなどを
使ってアプリケーション側で拡大処理を行う。
Windiows NT 以降、1), 3) 以外の制限はなくなったようです。
TNkDIB を使うと自動的に 1), 3) で描画されます。
TBigBitmap は 1) ~ 5) の処理を自動的に行います。
jun さんのコードの問題点は
Printer()->Canvas->CopyRect(MyOther, Bitmap->Canvas, MyRect);
の部分で、VCL は CopyRect でStretchBlt API を使っているため問題が起こります。
BitBlt と StretchBlt は同じデバイス間でのビットマップのコピーのための API で、
TBitmap とプリンタ間のコピーには使用できません。
多くの書籍で、jun さんのコードと同等のコードが紹介されていますが、
間違いですのでご注意ください。
#全く印刷できなかったり、たまに白紙が出たり、色が適切にでなかったりします。
#プリンタとビットマップの種類の組み合わせによってはは全く問題が出ない場合も有るので
#注意が必要です。
現在の XP や VISTA環境ならば、TNkDIB、TBigBitmap を使用しなくとも
「ビットマップがプリンタに印刷できない」
http://www.asahi-net.or.jp/~HA3T-NKMR/tips004.htm
のコードで十分対応できます( 1) 3) のみ対処しています)。
#Delphi 2009 で検証していません。あしからず。
jun さんは書きました:
>症状は解消したようです。何かキツネにつままれたようです。
>長年の困りごとが...「あれ?なんで出来ちゃうの?」という感じです。
>
----------
東京都 日野市 中村拓男