Na forum 4programmers.net korzystamy z plików cookies. Część z nich jest niezbędna do funkcjonowania
naszego forum, natomiast wykorzystanie pozostałych zależy od Twojej dobrowolnej zgody, którą możesz
wyrazić poniżej. Klikając „Zaakceptuj Wszystkie” zgadzasz się na wykorzystywanie przez nas plików cookies
analitycznych oraz reklamowych, jeżeli nie chcesz udzielić nam swojej zgody kliknij „Tylko niezbędne”.
Możesz także wyrazić swoją zgodę odrębnie dla plików cookies analitycznych lub reklamowych. W tym celu
ustaw odpowiednio pola wyboru i kliknij „Zaakceptuj Zaznaczone”. Więcej informacji o technologii cookie
znajduje się w naszej polityce prywatności.
tak jak w temacie, mam Image1 a w nim zaczytany z pliku obrazek jpeg o wymiarach 200x150.
W jaki sposób po jego środku narysować czerwony krzyżyk, i zapisać zmodyfikowany obrazek?
Do rysowania krzyżyka na ekranie korzystam z funkcji autorstwa @kAzek:
Kopiuj
procedure TfrmMenu.PaintX(p: TPoint);var
hWnd ,hButton: Windows.HWND;
hDC: Windows.HDC;
hPen, hOldPen: Windows.HPEN;
r: TRect;begin
hWnd := GetDesktopWindow;
hButton := GetDC(hButton);//rysowanie
hDC:= GetDC(hButton);//bedziemy rysowac ciagla linie 3px czerwona dlatego tworzymy sobie takie pioro
hPen:= CreatePen(PS_SOLID,3, RGB(255,0,0));
hOldPen:= SelectObject(hDC, hPen);//i je ustawiamy//bardziej tego rysowania nie dalalo sie skomplikowac ale nie chcialo mi sie liczyc ;)
MoveToEx(hDC, p.X, p.Y,nil);//na srodek
LineTo(hDC, p.X, p.Y -10);//ramie krzyża ma 10px
MoveToEx(hDC, p.X, p.Y,nil);//na srodek
LineTo(hDC, p.X, p.Y +10);
MoveToEx(hDC, p.X, p.Y,nil);//na srodek
LineTo(hDC, p.X -10, p.Y);
MoveToEx(hDC, p.X, p.Y,nil);//na srodek
LineTo(hDC, p.X +10, p.Y);//robimy po sobie porzadek
SelectObject(hDC, hOldPen);
DeleteObject(hPen);
ReleaseDC(hButton, hDC);
Sleep(300);//czekamy dla demonstracji (po 2 sekundach zostanie wymazany)// Windows.InvalidateRect(hButton, nil, True); //tak mozesz wymazac// end;end;
TJPGImage - wczytujesz obrazek
TBitmap - ustawiasz rozmiar jak u TJPGImage, kopiujesz obrazek z jpg do bmp
Rysujesz krzyżyk poprzez bitmap.canvas
Kopijesz obrzek z powrotem do jpg
zapisujesz obrazek.
Nie chcę zgadywać, ale Ty, @olesio i @furious programming robicie kawał dobrej roboty. @kAzek a tak wracając do tematu, jesteś tu ostatecznie w stanie pomóc?:)
@user322, nie wiem dlaczego tak się motasz z obliczeniem środka wycinka pulpitu - przecież to bardzo proste obliczenia; Zawsze możesz wspomóc się dodatkowymi stałymi, w których zapiszesz sobie wymiary wycinka i połowy wymiarów wycinka - będzie łatwiej użyć je w kodzie;
Łatwiej jest najpierw skopiować wycinek pulpitu, po czym na gotowym wycinku namalować krzyżyk; Poniżej masz zakomentowany przykład metody realizującej pobranie wycinka pulpitu, na którym rysowany jest biały krzyżyk w miejscu, w którym znajduje się kursor, po czym wycinek zapisywany jest do pliku JPG:
Kopiuj
procedure TMainForm.CapturePartOfDesktop(const APoint: TPoint;const AFileName: TFileName);const{ part dimensions }
PART_WIDTH = Integer(200);
PART_HEIGHT = Integer(150);{ half of part dimensions }
PART_HALF_WIDTH = Integer(PART_WIDTH shr1);
PART_HALF_HEIGHT = Integer(PART_HEIGHT shr1);const{ cross arm width }
CROSS_ARM_WIDTH = Integer(10);var
cnvDesktop: TCanvas;
rctDesktop: TRect;
bmpPart: TBitmap;
jpgPart: TJPEGImage;begin{ create desktop and part classes }
cnvDesktop := TCanvas.Create();
bmpPart := TBitmap.Create();try{ get the desktop handle }
cnvDesktop.Handle := GetWindowDC(GetDesktopWindow());{ set the part dimensions }
bmpPart.Width := PART_WIDTH;
bmpPart.Height := PART_HEIGHT;{ set the part rect bounds in desktop }
rctDesktop.Left := APoint.X - PART_HALF_WIDTH;
rctDesktop.Right := APoint.X + PART_HALF_WIDTH;
rctDesktop.Top := APoint.Y - PART_HALF_HEIGHT;
rctDesktop.Bottom := APoint.Y + PART_HALF_HEIGHT;{ copy rect from desktop to part }
bmpPart.Canvas.CopyRect(bmpPart.Canvas.ClipRect, cnvDesktop, rctDesktop);{ paint the cross on part bitmap }with bmpPart.Canvas dobegin{ set the pen style }
Pen.Color := clWhite;
Pen.Width :=3;{ draw the cross }
MoveTo(PART_HALF_WIDTH, PART_HALF_HEIGHT - CROSS_ARM_WIDTH);
LineTo(PART_HALF_WIDTH, PART_HALF_HEIGHT + CROSS_ARM_WIDTH);
MoveTo(PART_HALF_WIDTH - CROSS_ARM_WIDTH, PART_HALF_HEIGHT);
LineTo(PART_HALF_WIDTH + CROSS_ARM_WIDTH, PART_HALF_HEIGHT);end;{ save part to file }
jpgPart := TJPEGImage.Create();try
jpgPart.Assign(bmpPart);
jpgPart.SaveToFile(AFileName);finally
jpgPart.Free();end;finally{ free the desktop and part classes }
cnvDesktop.Free();
bmpPart.Free();end;end;
Użycie metody jest bardzo proste:
Kopiuj
procedure TMainForm.btnCaptureClick(Sender: TObject);var
pntCursor: TPoint;begin{ get cursor position on desktop }
GetCursorPos(pntCursor);{ capture and save the part of desktop }
CapturePartOfDesktop(pntCursor,'C:\Part.jpg');end;
Źródła aplikacji realizującej powyższy algorytm w załączniku;
Powyższy kod co prawda realizuje pobranie wycinka pulpitu, jednak nie jest zabezpieczony pod kątem pobrania takiego wycinka, który znajduje się zaraz przy krawędzi pulpitu; Jeśli punkt znajdować się będzie w mniejszej odległości niż połowa ustalonego wycinka - jego część pozostanie np. biała (ta która musiałaby zawierać obraz spoza ekranu); W takim przypadku trzeba by przesunąć punkt rysowania krzyżyka w odpowiednie miejsce w wycinku;
Na przyszłość polecam więcej kombinowania, dlatego że tutaj jedynym problemem było skopiowanie współrzędnych do rysowania krzyżyka z mojego wcześniejszego przykładu, w którym oczywiście wpisane były na pałę; Ale ten przykład miał przedstawić prostotę rysowania po kanwie bitmapy stąd sądziłem, że obliczenia już wykonasz sam.