Q&A

  • 이미지 저장 질문입니다.
이미지 드래그 질문인데요..

form1에 image1, image2를 두고서 image1에 이미지를 불러왔습니다,
(각 버튼을 이용해서 opendialog로)

그리고 image2에 이미지를 불러와서 textout이용해서 글자를 적었구요..

그 다음에 이 image2를 드래그해서 image1의 원하는 곳에 올려놓았습니다.

근데 저장을 하면 image1에 올려놓은 image2의 이미지는 저장이 안되고 image1만 저장이 됩니다.

왜 그런지 답변 부탁 드립니다.

openpicturedialog1, savepicturedialog1, button1(image2의 이미지 불러오는 버튼) , button2(image1의 이미지 불러오는 버튼), button3(저장버튼)



<!--CodeS-->
procedure TForm1.Image2MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
Var
  Pt : TPoint;
begin
  GetCursorPos( pt );
  pt := ScreenToClient( pt );
  if ssLeft in Shift then
     with Sender as TControl do
       SetBounds( Pt.x  - Form1.Left ,  Pt.Y - Form1.Top ,Width,Height);
end;



procedure TForm1.Button2Click(Sender: TObject);
begin
image1.Visible := true;
  if OpenPictureDialog1.Execute then
     image1.picture.loadfromfile( OpenPictureDialog1.FileName )
end;
procedure TForm1.Button3Click(Sender: TObject);
begin
if savePicturedialog1.execute then
//    image1.picture.bitmap.savetofile(savedialog1.filename);
    image1.picture.savetofile(savePicturedialog1.filename);
end;



procedure TForm1.Button1Click(Sender: TObject);
begin
   if OpenPictureDialog1.Execute then
      image2.picture.loadfromfile( OpenPictureDialog1.FileName );
   Image2.Canvas.Font.Name := 'Arial';
   image2.Canvas.font.Size := 30;
   Image2.Canvas.Font.Color := clpurple;
   Image2.Canvas.TextOut(110,120,DateToStr(Now));
   Image2.Canvas.Brush.Style := bsClear;
end;
<!--CodeE-->
6  COMMENTS
  • Profile
    봉봉 2007.12.14 23:11
    <!--CodeS-->
    image3.canvas.copyRect(Rect(image3.left, image3.top, image3.width, image3.height),
                                 image1.Canvas, Rect(0,0, 649, 809));

    image3.Canvas.CopyRect(Rect( (Image2.Left- Image1.Left),(Image2.Top- Image1.Top),
                                          (Image2.Left- Image1.Left)+image2.Width ,
                                          (Image2.Top- Image1.Top)+image2.Height ) ,
                                          image2.Canvas, Rect(0,0, 185, 129));
    <!--CodeE-->

    일단 답변 정말 감사합니다. 답변을 보고나서  위와같이 코딩을 했는데요...
    문제는 image1,image2에서 stretch를 true로 했거든요..
    불러오는 image의 크기를 image컴포넌트 크기에 맞춰서요..

    근데 문제는 image3에 복사를 하면 원래 image1,2의 크기로 나와서 일부분만 보여지게 되는데..
    이 경우는 어떻게 처리해야 할까요??

    자꾸 물어봐서 죄송하네요..ㅜ.ㅜ;;
  • Profile
    박상윤 2007.12.17 20:03
    내용이. 잘해가 안가서..
    걍... 그부분만..띠어서..
    소스를 올려 주심이 빠를듯 합니다.
      
  • Profile
    봉봉 2007.12.18 03:40

    아~ 그 문제를 해결했습니다.

    박상윤님의 답변이 정말 많이 도움이 되었습니다.~~!!!!!

  • Profile
    박상윤 2007.12.14 00:34

    이미지 1과 2는 엄연히 다른 콘트롤이죠..
    1을 저장 했으니.. 당연히 1만 저장 되는 거죠.
    보이는 그대로 저장하고 싶으시면 ....
    2개의 이미지를 합쳐서 하나로 만든후저장 해야 겠쪄..

    걍..비크맵이나.. 이미지를 하나 더 만들어서..
    이미지 1을 거기다 그리고..
    이미지 2를 위에 다시그린후..
    근넘을 저장 하시면 됩니다.

    그래야 원본 그래도 있어서.. 다시 이동 해도.
    괘안겠죠...
  • Profile
    봉봉 2007.12.14 01:47
    그런데요 .. 이미지3을 만들어서 그려야 되는데..
    예를 들어서 이미지 1의 오른쪽 위에 이미지 2가 있었는데 (처음 생성시)
    이미지2를 이미지 1의 왼쪽 아래로 옮겼다면..
    옮겨진 이미지2의 위치를 모르게 되는데
    canvas를 이용하면 시작점 위치를 정해줘야 되잖아요..
    Image1.Picture.Bitmap.Canvas.Draw( 600, 1000, image2.Picture.bitmap);
    이런식으로...

    이걸 어떻게 해야할지 모르겠거든요...

  • Profile
    박상윤 2007.12.14 19:32
    폼에서의 위치나 ..
    이미지 콤포가 속한 넘의 콘트롤의 위치로 상대적으로 개산 하시면되죠


    image1.left  (100)
    image1.Top (100)
    image1.Width (400)
    image1.Hight (400)

    초기) 왼쪽위

    image2.left  (100)
    image2.Top  (100)
    image2.Width (100)
    image2.Hight (100)


    이동후) 오른쪽 아래
    image2.left  (400)
    image2.Top  (400)
    image2.Width (100)
    image2.Hight (100)


    Image2가 Iamge1 안에 있다고 가정 하면  
    image1.Canvas.CopyRect(Rect( (Image2.Left- Image1.Left),(Image2.Top- Image1.Top),
                                          (Image2.Left- Image1.Left)+image2.Width ,
                                          (Image2.Top- Image1.Top)+image2.Hight ) ,
                                          image2.Canvas, Rect(0,0, image2.Width,image2.Hight));

    이런식으로 코딩 하면 되겠죠..
    비트맵의경우도 마찬가지죠...
    다만. 비트맵의 경우는 보이는 것관는 다르 다는 것을 조심하셔야 합니다.

    내부비트맵사이즈가 200,200 이라도 Image 사이즈가 100,100이면
    화면에는 이미지 사이즈로 100,100 보이므로  
    코딩하면 화면에는 다르게보일 수 있습니다.
    Image.canvas는 Image.canvas끼리
    Bitmap.canvas는 Bitmap.canvas끼리 작업하시면 쉽습니다.
    아니면 Image사이즈 = bitmap 사이즈 로 처음 부터 작업 하시면
    아에 신경 안써도 되지요...

    ^^
    그럼.. 수고 하세요.