下のプログラムでJpegをImage1の上にBmpとして読み込んでいるつもりなんですがどうやら間違っているらしいです。
if Str = '.jpeg' then
begin
jp := TJPEGImage.Create ;
Bmp := TBitmap.Create ;
jp.LoadFromFile(OpenDialog1.FileName) ;
Bmp.Assign(jp) ;
Form2.Image1.Picture.Bitmap := Bmp ;
end;
BitmapのファイルをImage1に読み込んだときはその上からペンを使って線を引けるのですがJpegだと
プロジェクトProject1.exeがEInvalidOperationクラスの例外を生成しました’ビットマップを持っているときのみイメージの変更が可能です’
という、エラーメッセージが表示されます。つまりImage1の上に展開されているのはBitmapに変換されたファイルではなくて、あくまでもJpegのイメージだと言う事なのでしょうか?
ちなみにImage上に引く線は座標だけ保存したいのでファイル自体には上書きしなくても良いのですが。
長文ですみません
どういう方法で線を引いていますか?
ペンを使って、というのは、TPenでしょうか。
ということは、Image1.Canvas.Penに値を設定して、Image1.Canvas.LineToで書く、ということでしょうか。
上の方法でJPEGを読み込んでおいて、
Image1.Canvas.MoveTo(0,0);
Image1.Canvas.LineTo(50,50);
としましたが線が引けます。
Image1.Picture.Bitmap.Canvas.MoveTo(0,0);
Image1.Picture.Bitmap.Canvas.LineTo(50,50);
でも引けてました。
どうやって書いていますか?
さっそくのお返事ありがとうございます
if Button = mbLeft then
begin
Image1.Canvas.Pen.Color := clRed ;
Image1.Canvas.Pen.Width := 3 ;
if Form1.RadioButton1.Checked = True then
begin
if Hantei = 1 then {Hanteiが1のときはすでに始点が決まっている}
Image1.Canvas.LineTo(X,Y)
else
begin
Image1.Canvas.MoveTo(X,Y) ;
Hantei := 1 ;
end ;
上のようにして線を引いています。ちょっとごちゃごちゃしてますが基本的には
Image1.Canvas.MoveTo(*,*);
Image1.Canvas.LineTo(*,*);
という形になってると思います。
環境はWin Me でDelphi6 Personalを使っています。
どうやら最初のプログラムのIf文がちゃんと機能してないようです(全Elseの処理をしている )。もう少し自分でがんばってみます。
こちらではうまくいってしまいます(Delphi5)
Delphi6から仕様が変わったんでしょうか。
再現させるには、
Form2.Image1.Picture.Bitmap := Bmp ;
を、
Form2.Image1.Picture.Bitmap := Jp ; { JPEGをそのままアサイン }
とすれば、Delphi5でも再現しました。
回避策は、
Bmp.Assign(jp) ;
を、
bmp.Width := jp.width;
bmp.Height := jp.Height;
bmp.Canvas.Draw(0, 0, jp);
Image1.Picture.Assign(bmp);
とすれば何とかうまくいきます。
# 色の設定等もコピーする必要があるかもしれません。
すいませんでした。単純に僕のミスです。Ifの判定のところで
if Str = '.jpeg' then の所で '.jpeg'ではなくて'.jpg' or '.JPG'にしなければいけませんでした。ご迷惑をかけました。
いつも初心者の僕にやさしく回答してくださってありがとうございます。
ツイート |