AFsoft WebSite(エーエフソフト・ウェブサイト)
 

オペレーティング・システムについて

プログラミングについて
ホームページについて
キャドについて
電子カタログについて
書籍・雑誌
イベント
リンク集
CADを考える:画像(ラスタ)(2)
前回は、画像(ラスタ)要素データについて記述しました。前回より少し間があいてしまいましたので少し追加しておきます。画像の透過=重ね合わせについてです。
 
画像の透過はSXF仕様でもさほど触れられていませんが、稀にCAD関係の掲示板では画像の透過・重ね合わせをしたい、というような話があります。というわけで、独自拡張として、付けてみます。
 
画像の透過は、Direct2Dは簡単です。
with D2DCanvas do begin
 ・・・
 Draw(0,0,im2.Graphics);
 ・・・
となっているところを、
with D2DCanvas do begin
 ・・・
 Draw(0,0,im2.Graphics,alpha);
 ・・・
と追加するだけです。アルファ値は、0(完全透明)〜255(非透過)で与えます。GDI+のほうは、ここまで簡単ではありませんが、可能です。
gra.DrawImage(im1,0.0,0.0);
となっていたところを
var
 ・・・
 cmp : TColorMatrix ;
 ima : TGPImageAttributes;
 ・・・
begin
・・・
 for j:=0 to 4 do
  for i:=0 to 4 do begin
   cmp[i,j] := 0.0 ;
   if (i = j) then cmp[i,j] := 1.0 ;
  end;
 cmp[3,3] := alpha/255.0 ;
 ima := TGPImageAttributes.Create;
 ima.SetColorMatrix(cmp,ColorMatrixFlagsDefault,
             ColorAdjustTypeBitmap);
 gra.DrawImage(im1,MakeRect(0.0,0.0,w,h),0.0,0.0,w,h,UnitPixel,ima);
 ima.Free ;
 ・・・
のようにします。カラーマップにアルファ値の指定をして、それを画像属性にセットして、画像を描画させる、という感じです。
 
 
それでは、画像データ構造は下記のように変更します。
UnitData.pas
type
 ・・・
 TDataImage = record     // 独自|表記要素|画像
  exf : Boolean ;      // 存在フラグ(True:有り False:無し)
  Layer : Integer ;     // レイヤ(1〜256)
  Alpha : Integer ;     // アルファ値(0〜255)
  start_x : double ;     // 配置点X座標(画像左下点)
  start_y : double ;     // 配置点Y座標
  size_x : double ;     // X方向サイズ[mm]
  size_y : double ;     // Y方向サイズ[mm]
  Angle  : double ;     // 回転角[°]
  ImgFileName : string ;   // 画像ファイル名
 end;
 ・・・
勿論、データ追加用関数も追加・変更する必要があります。
UnitData.pas
// 画像 データ項目の追加登録
// f : 画像ファイル名
// lay: レイヤ(1-256)
// al : アルファ値(0〜255)
// px : 配置点X
// py : 配置点Y
// sx : X方向サイズ
// sy : Y方向サイズ
// an : 回転角[°]
// (ret) True:登録OK False:NG
function TDataClass.AddDataImage(fn:string;lay,al:integer;
 px,py,sx,sy,an:double) : Boolean;
begin
 Result := False;
 if (fn = '') then exit ;
 if (lay < 1) or (lay > zLayN) then lay := 1 ;
 if (al < 0) then al :=  0;
 if (al > 255) then al := 255;
 if (sx < LIMIT10)or(sy < LIMIT10) then exit ;
 an := SetAngle(an);
 
 if (AddDataOrder(0,14,dImgN)) then begin
  try
   Inc(dImgN);
   if ((dImgN mod 100) = 1) then SetLength(dImg, dImgN+99);
   with dImg[dImgN-1] do begin
    exf := True ;
    Layer := lay ;
    Alpha := al ;
    start_x := px ;
    start_y := py ;
    size_x := sx ;
    size_y := sy ;
    Angle := an ;
    ImgFileName := fn ;
   end;
   Result := True ;
   AddLayerCnt(lay,-1,-1,-1,-1);
  except
   Dec(dImgN);
   Dec(dOrdN);
  end;
 end;
end;
 
同様に、UnitDataGraph.pas の DisplayImage手続き、それを呼び出している DisplayAllDat手続き、UnitGraph.pas の G_Image手続きも追加・変更を行います。
 
それでは、画像の登録・描画のテストです。
Unit1.pas
// 画像
fn := AppPath+'test.jpg' ;
gp.G_ImageSize(y1,x1,fn);
 
CData.AddDataImage(fn, 1,255, 20.0,200.0, 60.0,100.0, 30.0);
// 縦横比率を1:1にしたい場合
CData.AddDataImage(fn, 1,255, 60.0,200.0, 100.0,100.0*y1/x1, 15.0);
// 透過(アルファ値指定)
CData.AddDataImage(fn, 1,128,150.0,200.0, 100.0,100.0, 30.0);
// 縦横比率を1:1にしたい場合
CData.AddDataImage(fn, 1, 64,200.0,200.0, 100.0,100.0*y1/x1, 15.0);


 
それでは、ここまでのテストプログラムです。実行ファイル、gdiplus.dll、gdipフォルダは入っていません。ソースのみです。
 
CAD装置(1)
CAD装置(2)
メディア
AutoCADの
DIESELマクロ
CSV
DXF
PCES
IGES
STEP
数学とCAD
CAD作ろ!
CADを考える
 ▲PREV
 ▼NEXT
M7
Jw_cad
 
お問い合わせ 
本サイトはリンクフリーです
リンクバナー
(C)Copyright 1999-2015 By AFsoft All Rights Reserved.