Salvare tela come un immagine

Sto scrivendo un programma utilizzando Delphi XE2. Ho tracciare alcune linee e forme su una Tela. Voglio salvare la Tela come un file di immagine utilizzando una finestra di dialogo salva.

Quindi ho un pulsante salva sul mio modulo e fare clic su di esso, si apre la finestra di dialogo salva. Come devo procedere per essere in grado di salvare la Tela?

Si potrebbe anche disegnare su TImage tela, invece, e quindi salvare risultante TImage.Immagine.Bitmap

OriginaleL’autore user3062788 | 2013-12-03

3 Replies
  1. 10

    Al momento è più probabile che il codice si trova in un OnPaint evento per un TPaintBox o il modulo stesso. Che il codice potrebbe essere simile a questo:

    procedure TMyForm.PaintBox1Paint(Sender: TObject);
    begin
      with PaintBox1.Canvas do
      begin
        MoveTo(0, 0);
        LineTo(42, 666);
        // and so on.
      end;
    end;

    Abbiamo bisogno di fare un po ‘ di re-factoring. Abbiamo la necessità di estrarre il disegno di codice in un metodo separato. Passare che il metodo di una tela in modo che sia agnostico della tela su cui si disegna.

    procedure TMyForm.PaintToCanvas(Canvas: TCanvas);
    begin
      with Canvas do
      begin
        MoveTo(0, 0);
        LineTo(42, 666);
        // and so on.
      end;
    end;
    
    procedure TMyForm.PaintBox1Paint(Sender: TObject);
    begin
      PaintToCanvas(PaintBox1.Canvas);
    end;

    Siamo tornati esattamente da dove siamo partiti, ma pronto a colpire il vero obiettivo. Scriviamo una funzione di vernice per una bitmap e quindi salvare in un file:

    procedure TMyForm.PaintToFile(const FileName: string);
    var
      Bitmap: TBitmap;
    begin
      Bitmap := TBitmap.Create;
      try
        Bitmap.SetSize(Paintbox1.Width, Paintbox1.Height);
        PaintToCanvas(Bitmap.Canvas);
        Bitmap.SaveToFile(FileName);
      finally
        Bitmap.Free;
      end;
    end;

    Questo può, naturalmente, essere esteso ad altri tipi di immagine come GIF, PNG, JPEG etc.

    OriginaleL’autore

  2. 6

    L’ho fatto in questo modo (usando VCL). È necessario impostare il SaveDialog correttamente (l’utente di selezionare un file immagine valido, etc), ma si dovrebbe essere in grado di che. Ovviamente potete sostituire TPngImage con TJpegImge /salvare come BMP o quant’altro, forse si vuole consentire più le estensioni delle immagini e l’uso appropriato basato sull’input dell’utente dal SaveDialog.

    procedure TForm2.Button1Click(Sender: TObject);
      var Bmp: TBitmap;
          Png: TPngImage;
    begin
      if SaveDialog1.Execute then
      begin
        Bmp := TBitmap.Create;
        try
          Bmp.SetSize(Canvas.ClipRect.Right, Canvas.ClipRect.Bottom);
          BitBlt(Bmp.Canvas.Handle, 0, 0, Width, Height, Canvas.Handle, 0, 0, SRCCOPY);
          Png := TPngImage.Create;
          try
            Png.Assign(Bmp);
            Png.SaveToFile(SaveDialog1.FileName + '.png');
          finally
            Png.Free;
          end;
        finally
          Bmp.Free;
        end;
      end;
    end;

    OriginaleL’autore

  3. 0

    DNR: Generalizzando un po ‘ di codice, abbiamo

    uses Vcl.Imaging.pngimage
    
    procedure TfrmPrincipalTest.PrintCanvas(aCanvas: TCanvas; aRect: TRect);
      var Bmp: TBitmap;
          Png: TPngImage;
    begin
      if sSaveDialog1.Execute then
      begin
        Bmp := TBitmap.Create;
        try
          Bmp.SetSize(aCanvas.ClipRect.Right, aCanvas.ClipRect.Bottom);
          BitBlt(Bmp.Canvas.Handle, aRect.Top, aRect.Left, aRect.Right, aRect.Bottom, aCanvas.Handle, 0, 0, SRCCOPY);
          Png := TPngImage.Create;
          try
            Png.Assign(Bmp);
            Png.SaveToFile(sSaveDialog1.FileName + '.png');
          finally
            Png.Free;
          end;
        finally
          Bmp.Free;
        end;
      end;
    end;
    
    procedure TfrmPrincipalTest.I1Click(Sender: TObject);
    var vRect: TRect;
    begin
       vRect.Top:=0;
       vRect.Left:=0;
       vRect.Right:=sPageControl1.Width;
       vRect.Bottom:=sPageControl1.Height;
       PrintCanvas(sPageControl1.Canvas, vRect);
    end;
    È generalmente preferito avere qualche spiegazione della soluzione e la risposta per essere autonomo.

    OriginaleL’autore

Lascia un commento