Нам нужно 2 изображения – то, которое нужно сделать круглым и сама маска в виде круга. В процессе этого кода размеры этих изображений выравниваются, чтобы маска могла наложиться корректно, иначе это будет невозможно.
Помог вот это код с официального сайта Embarcadero
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 |
function TRegistrationFrame.BitMapFromMask(aSourceBitmap, aMaskBitmap: TBitmap): TBitmap; // The source bitmap and the mask will have the same size procedure CenterCopy(Source, Target: TBitmap); var X, Y: integer; TopLeft: TPoint; Rect: TRect; begin X := Source.Width div 2; Y := Source.Height div 2; //Define the top left corner of the rectangle to be copied TopLeft := Point(X - Target.Width div 2, Y - Target.Height div 2); //Define the rectangle to be copied Rect := TRect.Create(TopLeft, Target.Width, Target.Height); Target.CopyFromBitmap(Source, Rect, 0, 0); end; procedure CreateSameSizeBitmaps(Source1, Source2: TBitmap; var Target1, Target2: TBitmap); var minX, minY: Integer; begin // Resizes the initial bitmap and the mask to the same sizes // Finds the size of the result bitmap minX := Min(Source1.Width, Source2.Width); minY := Min(Source1.Height, Source2.Height); Target1 := TBitmap.Create(minX, minY); Target2 := TBitmap.Create(minX, minY); // Resizes to the initial bitmap CenterCopy(Source1, Target1); // Resizes to the mask CenterCopy(Source2, Target2); end; var Bitmap1, Bitmap2, Bitmap3: TBitmap; begin try // Resizes the source and the mask CreateSameSizeBitmaps(aSourceBitmap, aMaskBitmap, Bitmap1, Bitmap2); // Creates the final bitmap by applying the mask over the source Result := TBitmap.CreateFromBitmapAndMask(Bitmap1, Bitmap2); // iPhoto.Bitmap:=TBitmap.CreateFromBitmapAndMask(Bitmap1, Bitmap2); try // Displays the result //Result := Bitmap3; // Image3.Bitmap.UpdateHandles; finally // Frees the result bitmap //Bitmap3.Free; end; // Displays the resized images (source and mask) // Image4.Bitmap := Bitmap1; // Image5.Bitmap := Bitmap2; finally // Frees the resized source and mask bitmaps Bitmap2.Free; Bitmap1.Free; end; end; |
Вот как я его использовал
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
procedure TRegistrationFrame.TakePhotoFromLibraryAction1DidFinishTaking(Image: TBitmap); var imgRotated: TImage; minSide: integer; srcImage, maskImage: TImage; s: TResourceStream; newSize: Integer; R: Byte; ms: TMemoryStream; o: string; answer: string; begin maskImage := TImage.Create(Self); imgRotated := TImage.Create(Self); ms := TMemoryStream.Create; s := TResourceStream.Create(hInstance, 'mask4', RT_RCDATA); try { Image.SaveToStream(ms); o := GetExifOrientation(ms); if o = 'Rotate 90°' then Image.Rotate(90) //RotateBitmap90DegreesClockwise(Image) else if o = 'Rotate 180°' then Image.Rotate(180) else if o = 'Rotate 270°' then begin Image.Rotate(180); Image.Rotate(90); end; } // Image.Resize(180, 180); maskImage.Bitmap.LoadFromStream(s); iPhoto.Bitmap := BitMapFromMask(Image, maskImage.Bitmap); //CreateFromBitmapAndMask(img.Bitmap, maskImage.Bitmap); // := BitMapFromMask(Image, maskImage.Bitmap); PositionElements; LayoutNewPhoto.Visible := true; finally maskImage.Free; imgRotated.Free; ms.Free; s.Free; end; end; |