[Delphi:90284] Delphi7 の Image で Bitmap図 を 正確に標示したい。

825 views
Skip to first unread message

大須賀

unread,
Feb 14, 2008, 8:18:19 AM2/14/08
to Del...@ml.users.gr.jp
大須賀です。ML 2回目の質問です。

AutoCadLt で製図した図面を Bitmapファイル (Zumen.Bmp) に書きだします。
Delphi7 Image1.Picture.LoadFromFile('Zumen.Bmp') で画面に標示します。
Image1  Proportional = True, Stretch = False です。
Image1 の縦横比 は Zumen.Bmp の縦横比とほぼ同じです。

Zumen.Bmp ではきれいだった図面が Image1では変形して 「一部」の太線が細く標示されてしまいます。
図面ですので 何とか太線、細線を正確に標示したいとおもいます。

よろしくお教え願います。


khe00221

unread,
Feb 14, 2008, 11:52:42 AM2/14/08
to Del...@ml.users.gr.jp
Proportional = True という事は
縦横の比率を変えずに Image のサイズに変更されているはずです
(太線が補足なると言うことは縮小かな)
(Stretch = True の場合縦横の比率を無視してImageのサイズに変更されます
画像サイズが縮小されているので当然線が消えたり補足なったりするのは当然で

そのまま表示したいのならば AutoSize := True にするしかありません。

sasaki_tadayoshi

unread,
Feb 14, 2008, 9:53:45 PM2/14/08
to Del...@ml.users.gr.jp
AutoCadLtはよく知りませんが、BMPファイルのはきだし方ではないでしょうか?

CAD画面で縮小や拡大させた状態でBMPファイルをつくって、DELPHI側で確認したらヒントがでるかも。

はずしてたら、ゴメン


MoonDoldo

unread,
Feb 15, 2008, 4:48:58 AM2/15/08
to Del...@ml.users.gr.jp
 MoonDoldoです。

>Zumen.Bmp ではきれいだった図面が Image1では変形して 「一部」の太線が細く標示

>されてしまいます。
 の「Zumen.Bmp ではきれいだった図面が」というのは、Zumen.Bmpのファイル
を直接他のソフトで見た場合は綺麗だった…という認識で良いのでしょうか?

 そういう仮定であれば、TImageで


>Image1  Proportional = True, Stretch = False です。
>Image1 の縦横比 は Zumen.Bmp の縦横比とほぼ同じです。

…という設定によって、本来のサイズより小さい表示…いわゆる縮小表示をして
いるからではないでしょうか?

 TImageで標準で行われる縮小は恐らく?「ニアレストネイバー法」という縮小
方法です。
 処理は高速なのですが、ドットを単純に間引くだけの処理なので、縮小された
画像は見た目が非常に汚いです。

縮小方法についての説明は、HIROPONさんが書かれている以下のWebページを見る
と、視覚的に分かりやすいと思います。
●貧乏人のためのCG講座 CG知識編
http://tt.sakura.ne.jp/~hiropon/lecture/trans.html


 では実際にDelphiではどうすればよいのかと言うと、私は以下のライブラリを
使って、自前で画像を縮小しています。

1.中村さんが出しているグラフィックライブラリを使う
●Delphi Graphic Secrets サポートWeb 「DHGL 1.2」
http://www.asahi-net.or.jp/~HA3T-NKMR/DGS/
------------------
具体的にはBitmapUtilsユニットの以下の命令あたりを使います

// Bi-Linear法で拡大
function Enlarge(Bitmap: TBitmap; Width, Height: Integer): TBitmap;
overload;
// 積分法で縮小
function Shrink(Bitmap: TBitmap; Width, Height: Integer): TBitmap;
overload;
// Bi-Linear & 積分法で 拡大縮小
function Stretch(Bitmap: TBitmap; Width, Height: Integer): TBitmap;
overload;
-------------------

2.部員弐号さんが出しているグラフィックライブラリを使う
●buinGL - buinGraphicsLibraries 「AlphaBitmap3」
http://buin2gou.com/buinglib/
------------------
具体的にはABitmapFilters32ユニットの以下の命令あたりを使います

//拡大縮小機能。
procedure Stretch_ZoomIn_Saikin32(ix2,iy2,iw2,ih2:Double;ox2,oy2:Double;
ow2,oh2:Integer;InBMP,OutBMP:TBitmap);
procedure Stretch_ZoomIn_BiLinear32(ix2,iy2,iw2,ih2:Double;ox2,oy2:
Double;ow2,oh2:Integer;InBMP,OutBMP:TBitmap);
procedure Stretch_ZoomIn_BiLinearMMX32(ix2,iy2,iw2,ih2:Double;ox2,oy2:
Double;ow2,oh2:Integer;InBMP,OutBMP:TBitmap);

※ただし、これを使う場合はTBitmap互換のTABitmapクラスを使わないとうまく
動かないみたいです
これはABitmapユニットにあります。
-------------------

 もっと良いグラフィックライブラリがあるのかもしれませんが、私はこれぐら
いしか知りません。
※フリーでもっと良いライブラリを知っている方はぜひ教えて下さい。


 余談ですが、グラフィック関係を扱うと、どうしてもミスでメモリーリークし
てしまう書き方をしてしまうことが多いので、FastMMも一緒に使う事をお勧めし
ます。
 使い方は、Mr.XRAYさんの書かれている以下のページが参考になると思います。
●FastMMの導入
http://homepage2.nifty.com/Mr_XRAY/Delphi/CompoInstall/UsageFastMM.htm

 実際のダウンロード先はこちらです。
●FastMM 4.78ダウンロード(2008/2/15時点での最新)
http://sourceforge.net/project/showfiles.php?group_id=130631


 ではでは頑張ってください。

ムーンドルド

大須賀

unread,
Feb 15, 2008, 6:45:34 AM2/15/08
to Del...@ml.users.gr.jp
khe00221様
sasaki-tadayoshi様
MoonDoldo様

早速の皆様のご支援有り難うございます。深く感謝いたします。

(1)AutoCadLtで作図した部品図を AutoCadLtの命令 (BmpOut)でBmp形式のファイル
(Zumen.Bmp) に書き出します。

(2)Windows -Paint - 「変形」 で白黒画(Zumen.Bmp)に変更します。
この時点では 円弧のギザギザは気になりますが太い直線、細い直線はほぼ正確に標示されます。

(3)Zumen.Bmp を Delphi7.Imageで Loadして画面表示すると一部の太い線が細くなってしまいます。

わざわざBmp形式に変換して画面表示するのは標示が早いからです。
部品図の為 何回も見に行くため その都度Cadを起動して標示するのは時間がかかりすぎるのです。我慢すればいいのですが白黒線と円弧の図面ですので変形が気になります。
印刷(Mr.XrayさんのplPrev1.StretchDrawPic)では満足できる描画です。

MoonDoldo様 大量の資料 有り難うございます。
いままでは縦横比だけの問題かと簡単におもっていました。
bmpファイルの縦、横の大きさを知る方法があればまたお教え願います。
これから相当難しいとはおもいますがいただいた資料をもとにがんばって勉強します。御礼申し上げます。

osuk...@uv.tnc.ne.jo 大須賀明美

ht_...@nifty.com

unread,
Feb 18, 2008, 4:55:03 AM2/18/08
to Del...@ml.users.gr.jp
こんにちは。
BMPの加工を手動で行われているのであれば、

[スプールファイル変換ツール]
http://homepage1.nifty.com/ht_deko/junkbox.html#SPLCONV
http://ht-deko.bbs.coocan.jp/?t_id=207

をお使いになると、ちょっとだけ幸せになるかもしれません。
画像の形式はEMFになりますが、DelphiのTImageで、普通に読み込む事が可能です。

--
by DEKO
-------------------------------------
http://homepage1.nifty.com/ht_deko/
ht_...@nifty.com
-------------------------------------

Reply all
Reply to author
Forward
0 new messages