Jpg画像の回転処理で指定しているImageに描画されない

解決


のん  2013-06-11 10:04:44  No: 44655  IP: 192.*.*.*

お世話になります。
長々と見苦しいソースで申し訳ありません。

実現したいことは、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;

編集 削除
のん  2013-06-11 10:06:37  No: 44656  IP: 192.*.*.*

追記です。

上記と同じロジックでImage1を指定して描画すると
回転した画像がImage1に表示されます。

編集 削除
take  2013-06-11 12:01:14  No: 44657  IP: 192.*.*.*

ソースが足りなくないですか?

処理開始のbeginの次の段下げが2段で
finallyだけありますし・・・

【このソース】
Image2の画像を回転させたものがImage1に表示される

【このソースのImage2の箇所を全部Image1に置き換え】
Image2の画像を回転させたものがImage1に表示される

ってことですか?

編集 削除
のん  2013-06-11 12:23:39  No: 44658  IP: 192.*.*.*

失礼しました。
実際のソースを一部切り出しで出していたため、tryとbegin,endが抜けておりました。Bmp2 : TBitMap;の変数宣言も不要ですね…
この処理はボタンクリックイベントに実装しています。

>【このソース】
>Image2の画像を回転させたものがImage1に表示される

はい、その通りです。

>【このソースのImage2の箇所を全部Image1に置き換え】
>Image2の画像を回転させたものがImage1に表示される

ボタン1のクリックイベントで、
Image1にセットしている画像を上記の処理(Image2をImage1に置き換えた状態です)で回転するとImage1に表示されます。これが希望の動きです。

同様に、ボタン2のクリックイベントでImage2にセットしている画像を上記のソースで回転すると回転後の画像がImage1に表示されてしまいます。

文章が分かりにくくてすみません。
よろしくお願いいたします。

編集 削除
Harry  2013-06-11 12:50:42  No: 44659  IP: 192.*.*.*

コード中にImage1が登場しないかぎり、Image1に描画されることはないのでは。

不完全に一部を抜粋されるよりも、誰でもすぐに検証できるような、確実に動く形の
(問題が再現する、最小の)コードを提示していただいた方が良いと思います。
例えば、このような形で。
procedure TForm1.Button1Click(Sender: TObject);
begin
  〜
end;

最小のコードに仕立て直す過程で、自然と問題ポイントが見えてくることも多いですよ。
環境もお忘れなく。それと、usesの情報もあると良いですね。

編集 削除
のん  2013-06-11 13:26:14  No: 44660  IP: 192.*.*.*

Harry様
コードをもう一度見直してみたところ、ポカミスでした。

Image2の画像がImage1に表示されていたのではなく、
プログラム内で、Image2の画像のTop、LeftをImage1のTop、Leftと
同じ設定にしてしまっていたために画像が重なっていました。

皆様、貴重なお時間すみませんでした。
ありがとうございました。

編集 削除