tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板) [ツリー表示へ]   [Home]
一括表示(VB.NET VB2005)
タイトルBMP印刷を制御したい
記事No11600
投稿日: 2016/01/20(Wed) 17:07
投稿者SUZUKI
VB6.0からVB2005に変換挑戦中のSUZUKIです
連続投稿で申し訳ありませんが、また壁にぶつかったので
よろしくお願いします
問題はBMPファイルの印刷です
(VB2005の正規の印刷の仕方に戸惑っている自分がいるのですが。。。)

同じように印刷しているイメージなのですが
VB2005の印刷は拡大されて印刷されてしまいます

VB6.0

Dim x As Picture
Set x = LoadPicture("C:\TEST.bmp")
Printer.PaintPicture x, 7, 10, 63, 43

VB2005
(Printer Compatibility Library 1.0利用)

Dim image1 As Bitmap
image1 = New Bitmap("C:\TEST.bmp", True)
Printer.PaintPicture(image1, 7, 10, 63, 43)

以上です
なぜ拡大するのか理解出来ていません


* BMPサイズ変換ソフトを使ってファイル自体を縮小するか
  それとも他の印刷の仕方(縮小印刷?)があるのかが知りたいです

* VB2005 のPrintDocumentを使う方法 
  お勉強中ですが、それでも制御するのは難しいのではと
  思い質問させて頂きました

[ツリー表示へ]
タイトルRe: BMP印刷を制御したい
記事No11601
投稿日: 2016/01/21(Thu) 11:01
投稿者SUZUKI
色々 テストを重ねたのですが
拡大するBMPファイルと同じに印刷されるBMPファイルがある事が
判明しました(7つのファイルの内4つはまともに印刷される)
VB6.0では全てうまく印刷されます
よってVBのプログラムの相違もありますが
BMPファイルの中味にも何か問題がありそうと思って来ました
同じようにファイルを作ったのですがどこかで違っているようです
BMPファイルの違いを見つけられるソフト等ってあるのでしょうか?
BMPもモノクロ、16色、256色、24ビットと増えているのに
気が付きました
ただ、自分のBMPがどの種類か意識して作ったわけでないので
多分モノクロとは思うのですが?
非常にローカルな話になり、VBコードも関係するのか
判断つかなくなって来ました
ここの掲示板でよいかも怪しくなったと思っているのですが
何かあれば、よろしくお願いします

[ツリー表示へ]
タイトルRe^2: BMP印刷を制御したい
記事No11602
投稿日: 2016/01/21(Thu) 11:34
投稿者Hongliang
正しく印刷できている画像とそうでない画像とで、
image1.HorizontalResolution / VerticalResolutionに違いがありますか?

[ツリー表示へ]
タイトルRe^3: BMP印刷を制御したい
記事No11603
投稿日: 2016/01/21(Thu) 16:16
投稿者SUZUKI
> 正しく印刷できている画像とそうでない画像とで、
> image1.HorizontalResolution / VerticalResolutionに違いがありますか?
回答ありがとうございます
違いがありました

正しく印刷されている
HorizontalResolution = 96.01199
VerticalResolution   = 96.01199

VB6.0より拡大されて印刷される
HorizontalResolution = 71.9836
VerticalResolution   = 71.9836

悲しいかな これが何を意味するかわからず
違ってはいます
PAINTPICTURE の引数についてお勉強中ですが
VBコードとBMPファイルが微妙に関連しているんですね

[ツリー表示へ]
タイトルRe^4: BMP印刷を制御したい
記事No11604
投稿日: 2016/01/21(Thu) 16:50
投稿者Hongliang
bmp形式には水平解像度/垂直解像度のパラメータがあります。
この場合の解像度というのは単位距離あたりを何ピクセルで埋めるかという意味ですが、
旧VBでは(ロードされるタイミングかPaintPictureされるタイミングかは分かりませんが)これが無視され、
現VBでは有効になっていると言うことでしょう。

たとえば96dpiの画像は、96ピクセルを1インチとして描画します。
これが72dpiの画像になると、72ピクセルで1インチとして描画します。
同じ横960ピクセルの画像が、片や10インチとなり、片や13.3...インチとなるわけですね。

PaintPictureの仕様には詳しくないですが、第4・第5引数は描画先のサイズらしいので、
たとえば72dpiの画像を、96dpiの画像の時と同じ横幅で描画するのであれば、
image1.Width / (96 / 72)
という計算でいけるのではないでしょうか。

[ツリー表示へ]
タイトルRe^5: BMP印刷を制御したい
記事No11605
投稿日: 2016/01/21(Thu) 19:37
投稿者魔界の仮面弁士
>> image1.HorizontalResolution / VerticalResolutionに違いがありますか?
> 違いがありました

画像ファイルのプロパティからも確認できるかも。
http://blogs.wankuma.com/myugaru/archive/2008/03/09/126920.aspx



> たとえば96dpiの画像は、96ピクセルを1インチとして描画します。

VB6 の場合、座標の単位系は Printer.ScaleMode プロパティで設定します。
(このプロパティは、Compatibility Library にもあったはず)


既定では、ピクセル単位系ではなく Twips 単位系だったはずですが、今回、
>> Printer.PaintPicture x, 7, 10, 63, 43
のような小さい値が指定されていることは、実際には別の単位系に変更されているのでしょうね。

http://hanatyan.sakura.ne.jp/patio/read.cgi?no=175


まぁ、画像側の解像度(96dpi なのか 72dpi なのか)が原因ということだとすれば、
その割合を単純に乗じてやれば、解決するものと思います。

[ツリー表示へ]
タイトルRe^6: BMP印刷を制御したい
記事No11609
投稿日: 2016/01/22(Fri) 09:22
投稿者SUZUKI
魔界の仮面弁士さん
回答ありがとうございます
なかなか理解しずらい箇所があるのですが
必ず読破しますので、時間を頂きます

[ツリー表示へ]
タイトルRe^5: BMP印刷を制御したい(解決)
記事No11608
投稿日: 2016/01/22(Fri) 09:19
投稿者SUZUKI
Hongliangさん
アドバイスありがとうございます
なぞが解けてすっきりです
ただ、こちらのBMPファイルの特性でしょうか
image1.width /96*72 = 2566/96*72 = 1924.5
image1.height /96*72 = 3142/96*72 = 2356.5
を代入すると表示されず
Printer.PaintPicture(image1, 7, 10, 63, 43, 0, 0, 約560, 約350)
こんな感じにすると、まあまあ同じかなという感じです
試行錯誤で悔しい所はありますが
目的は達しましたのでありがとうございます
もう少し最適値を追求する予定です
あと、ScaleMode の情報が抜けていました
”4”を採用しています 

[ツリー表示へ]