お世話になります。
長々と見苦しいソースで申し訳ありません。
実現したいことは、Image2にある画像をImage2に回転させて
再描画したいです。
下記のソースは、Image2を指定して描画させようとしているのですが
指定していないImage1に回転した画像が描画されてしまいます。
何が原因かわからないので行き詰っております。ご教授お願いします。
**********************************************************************
var
Gcanvas : TGPGraphics;
Bmp : TGPBitmap;
iWidth : Integer;
iHeight : Integer;
Jpg : TJpegImage;
Bmp2 : TBitMap;
Picture : TPicture;
Ms : TMemoryStream;
begin
// TPictureを新規作成
Picture := TPicture.Create;
Bmp := TGPBitmap.Create(D:\AAA.jpg);
Picture.LoadFromFile(D:\AAA.jpg); // Jpgファイルサイズを取得
iHeight := Picture.Height;
iWidth := Picture.Width;
Image2.Picture.Bitmap.SetSize(iWidth, iHeight);
Gcanvas := TGPGraphics.Create(Image2.Picture.Bitmap.Canvas.Handle);
Bmp.RotateFlip(Rotate270FlipNone); // 左に90度回転(左向きは270度になる)
// 回転したイメージを表示
gcanvas.DrawImage(bmp, 1, 1, iWidth, iHeight);
// 横より縦のサイズが大きかったら縦の画像 サイズの変数は回転前のサイズなので逆になる
if iHeight > iWidth then begin
Image2.Height := 176;
Image2.Width := 224;
Image2.Left := 11;
end else begin
Image2.Height := 200;
Image2.Width := 190;
Image2.Left := 28;
end;
// イメージのサイズより大きかったらイメージサイズに合わせる 小さければそのまま表示する
if (Image2.Height > iHeight) or (Image2.Width > iWidth) then begin
Image2.Stretch := False;
end else begin
Image2.Stretch := True;
end;
Image2.Stretch := True;
// 回転したイメージをjpgでサーバに保存
Ms := TMemoryStream.Create;
Jpg := TJpegImage.Create;
if Bmp.Save(TStreamAdapter.Create(Ms), ImageJPEGClsid) <> OK then begin
MessageDlg('画像を更新できません。', mtInformation, [mbOk], 0);
end else begin
Ms.Position := 0;
Jpg.LoadFromStream(Ms); // BITMAPをストリームからJpgに読み込み
Image2.Picture.Assign(Jpg);
Image2.Picture.SaveToFile(D:\AAA.jpg);
end;
finally
Bmp.Free;
Gcanvas.Free;
Jpg.Free;
Ms.Free;
Picture.Free;
end;
追記です。
上記と同じロジックでImage1を指定して描画すると
回転した画像がImage1に表示されます。
ソースが足りなくないですか?
処理開始のbeginの次の段下げが2段で
finallyだけありますし・・・
【このソース】
Image2の画像を回転させたものがImage1に表示される
【このソースのImage2の箇所を全部Image1に置き換え】
Image2の画像を回転させたものがImage1に表示される
ってことですか?
失礼しました。
実際のソースを一部切り出しで出していたため、tryとbegin,endが抜けておりました。Bmp2 : TBitMap;の変数宣言も不要ですね…
この処理はボタンクリックイベントに実装しています。
>【このソース】
>Image2の画像を回転させたものがImage1に表示される
はい、その通りです。
>【このソースのImage2の箇所を全部Image1に置き換え】
>Image2の画像を回転させたものがImage1に表示される
ボタン1のクリックイベントで、
Image1にセットしている画像を上記の処理(Image2をImage1に置き換えた状態です)で回転するとImage1に表示されます。これが希望の動きです。
同様に、ボタン2のクリックイベントでImage2にセットしている画像を上記のソースで回転すると回転後の画像がImage1に表示されてしまいます。
文章が分かりにくくてすみません。
よろしくお願いいたします。
コード中にImage1が登場しないかぎり、Image1に描画されることはないのでは。
不完全に一部を抜粋されるよりも、誰でもすぐに検証できるような、確実に動く形の
(問題が再現する、最小の)コードを提示していただいた方が良いと思います。
例えば、このような形で。
procedure TForm1.Button1Click(Sender: TObject);
begin
〜
end;
最小のコードに仕立て直す過程で、自然と問題ポイントが見えてくることも多いですよ。
環境もお忘れなく。それと、usesの情報もあると良いですね。
Harry様
コードをもう一度見直してみたところ、ポカミスでした。
Image2の画像がImage1に表示されていたのではなく、
プログラム内で、Image2の画像のTop、LeftをImage1のTop、Leftと
同じ設定にしてしまっていたために画像が重なっていました。
皆様、貴重なお時間すみませんでした。
ありがとうございました。