MAC OSX - Help Capture screeen region- lazTrans 2.0.0 lazarus / 39-Graphics ---------------------------------------------------------------------- laguna · 2018-04-17 18:19 I added the capture button, create a copy of the screen, and with the mouse, draw a rectangle, edit it in OCR, and get the text. The code works great under WINDOWS, but in MAC Sierra 13.3, it does not work. Give me a hand to correct this code. Code: Pascal  [Select][+][-]window.onload = function(){var x1 = document.getElementById("main_content_section"); if (x1) { var x = document.getElementsByClassName("geshi");for (var i = 0; i unit ScreenShotForm; {$mode objfpc}{$H+} interface uses  SysUtils,  Classes, Forms, Controls, Graphics, Dialogs, Buttons,  StdCtrls, Types, LCLIntf, LCLType; type   { TfrmScreenShot }   TfrmScreenShot = class(TForm)    BClose: TBitBtn;    LDirections: TLabel;    procedure BCloseClick(Sender: TObject);    procedure FormCreate(Sender: TObject);    procedure FormDestroy(Sender: TObject);    procedure FormMouseDown(Sender: TObject; Button: TMouseButton;      Shift: TShiftState; X, Y: Integer);    procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);    procedure FormMouseUp(Sender: TObject; Button: TMouseButton;      Shift: TShiftState; X, Y: Integer);    procedure FormPaint(Sender: TObject);  private    FScreenshot: TBitmap;    FMakingSelection: boolean;    FSelectionMade: boolean;    FSelectionRect: TRect;    procedure SaveSelectedRegion;    function GetScreenshot: TBitmap;  end; var  SelectedRegionFilename : string; var  frmScreenShot: TfrmScreenShot; implementation {$R *.lfm} { TfrmScreenShot }   procedure TfrmScreenShot.FormCreate(Sender: TObject);begin  frmScreenShot.Top := 0;  frmScreenShot.Left :=0;  BorderStyle:=bsNone;  WindowState:=wsFullScreen;  FScreenshot:=GetScreenshot;  Canvas.Pen.Color:=clRed;  frmScreenShot.Cursor := crCross;end; procedure TfrmScreenShot.BCloseClick(Sender: TObject);begin end; procedure TfrmScreenShot.FormDestroy(Sender: TObject);begin  frmScreenShot.Cursor := crDefault;  FScreenshot.Free;end; procedure TfrmScreenShot.FormMouseDown(Sender: TObject; Button: TMouseButton;  Shift: TShiftState; X, Y: Integer);begin  FMakingSelection:=True;  FSelectionRect.Left:=X;  FSelectionRect.Top:=Y;end; procedure TfrmScreenShot.FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);begin  if FMakingSelection then begin    FSelectionRect.Right:=X;    FSelectionRect.Bottom:=Y;    Repaint;  end;end; procedure TfrmScreenShot.FormMouseUp(Sender: TObject; Button: TMouseButton;  Shift: TShiftState; X, Y: Integer);begin  if FMakingSelection then begin    FMakingSelection:=False;    FSelectionMade:=True;    Repaint;    SaveSelectedRegion;    Close;  end;end; procedure TfrmScreenShot.FormPaint(Sender: TObject);begin  if Assigned(FScreenshot) then    Canvas.Draw(0, 0, FScreenshot);  if FMakingSelection and not IsRectEmpty(FSelectionRect) then    Canvas.DrawFocusRect(FSelectionRect);  if FSelectionMade then with Canvas do begin    Frame(FSelectionRect);    FSelectionMade:=False;  end;end; function TfrmScreenShot.GetScreenshot: TBitmap;var  screenDC: HDC;begin  screenDC:=GetDC(0);  try    Result:=TBitmap.Create;    Result.LoadFromDevice(screenDC);  finally    ReleaseDC(0, screenDC);  end;end; procedure Bmp2Jpeg(bitMio:TBitmap; JpgFileName: string);var  Bmp: TBitmap;  Jpg: TJPEGImage;begin  Bmp := TBitmap.Create;  Jpg := TJPEGImage.Create;  try    Bmp :=  bitMio;    Jpg.Assign(Bmp);    Jpg.SaveToFile(JpgFileName);  finally    Jpg.Free;    Bmp.Free;  end;end;  procedure TfrmScreenShot.SaveSelectedRegion;var  bmp: TBitmap;  r: TRect;  sz: TSize;begin  if IsRectEmpty(FSelectionRect) then    Exit;  sz:=Size(FSelectionRect);  r:=Rect(0, 0, sz.cx, sz.cy);  bmp:=TBitmap.Create;  try    bmp.SetSize(sz.cx, sz.cy);    bmp.Canvas.CopyRect(r, Canvas, FSelectionRect);    SelectedRegionFilename := ExtractFilePath(ParamStr(0)) + 'temp';    Bmp2Jpeg(bmp, SelectedRegionFilename+'.jpg');  finally    FSelectionRect:=Rect(0, 0, 0, 0);   // bmp.Free;  end;end; end. ---------------------------------------------------------------------- circular · 2018-04-17 19:50 If it doesn't work when it comes to make a copy of the selected rectangle, you could try copying from FScreenshot instead of form Canvas: Code: [Select]bmp.Canvas.CopyRect(r, FScreenShot.Canvas, FSelectionRect); ---------------------------------------------------------------------- lainz · 2018-04-17 20:35 I tested screenshot on several OS, with BGRABitmap, and did not work fine. Only works fine on Windows, and on Linux depending if there is some library I can't detect... On mac if I remember well, did not work also. But taking a region of the same screen did work. ---------------------------------------------------------------------- laguna · 2018-04-18 06:03 I started from this program attached, creating a copy of the screen, capturing a portion, and saving the file in jpeg format. Help me make it work under MAC OSX. Thank you all. Fix Code: Code: Pascal  [Select][+][-]window.onload = function(){var x1 = document.getElementById("main_content_section"); if (x1) { var x = document.getElementsByClassName("geshi");for (var i = 0; i   procedure TfrmScreenShot.FormCreate(Sender: TObject);begin   //Remove code in this procedure and move code in FormShowend;  procedure TfrmScreenShot.FormShow(Sender: TObject);begin    frmScreenShot.Top := 0;  frmScreenShot.Left :=0;  BorderStyle:=bsNone;  WindowState:=wsFullScreen;  FScreenshot:=GetScreenshot;  Canvas.Pen.Color:=clRed;  frmScreenShot.Cursor := crCross;end;