|
前回は、画像(ラスタ)要素データについて記述しました。前回より少し間があいてしまいましたので少し追加しておきます。画像の透過=重ね合わせについてです。
画像の透過は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
|