Почему при попытке обрезать растровое изображение появляется пустой TImage? - PullRequest
0 голосов
/ 25 ноября 2018

Я следовал этому ответу, чтобы обрезать изображение: Как мне обрезать растровое изображение «на месте»?

В Delphi 7 у меня есть TImage Image_center.

Image := TPngObject.Create;
try
  Image.LoadFromStream(Stream);
  Image_center.Picture.Graphic := Image;
  Image_center.width := Image.width;
  Image_center.height := Image.height;
  Image_center.Left := ( form1.clientWidth div 2 ) - (Image_center.width div 2);
  CropBitmap(Image_center.Picture.Bitmap, 1, 45,   Image.width, Image.height-45);
finally
  Image.Free;
end;

Но в результате TImage содержит белое растровое изображение.Если я пропущу / закомментирую функцию CropBitmap, я смогу увидеть изображение.Так что проблем с загрузкой нет.Почему вместо изображения отображается белая область?

procedure CropBitmap(InBitmap : TBitmap; X, Y, W, H :Integer);
begin
  BitBlt(InBitmap.Canvas.Handle, 0, 0, W, H, InBitmap.Canvas.Handle, X, Y, SRCCOPY);
  InBitmap.Width :=W;
  InBitmap.Height:=H;
end;

Delphi 7 Растровые методы:

In TBitmap

~TBitmap
            Assign
            Create
            Destroy
            Dormant
            FreeImage
            HandleAllocated

LoadFromClipboardFormat
            LoadFromResourceID
            LoadFromResourceName
            LoadFromStream
            Mask
            ReleaseHandle

ReleaseMaskHandle
            ReleasePalette
            SaveToClipboardFormat
            SaveToStream
            TBitmap

Derived from TGraphic

LoadFromFile
            SaveToFile

Derived from TInterfacedPersistent

AfterConstruction
            QueryInterface

Derived from TPersistent

GetNamePath

Derived from TObject

BeforeDestruction
            ClassInfo
            ClassName
            ClassNameIs
            ClassParent
            ClassType
            CleanupInstance

DefaultHandler
            Dispatch
            FieldAddress
            Free
            FreeInstance
            GetInterface
            GetInterfaceEntry

GetInterfaceTable
            InheritsFrom
            InitInstance
            InstanceSize
            MethodAddress
            MethodName
            NewInstance

SafeCallException

1 Ответ

0 голосов
/ 26 ноября 2018

Вы (ложно) предполагаете, что Image_center.Picture.Bitmap даст вам изображение в виде растрового изображения.Это верно только в том случае, если это растровое изображение, иначе оно будет перезаписывать вашу графику пустым растровым изображением.

Вместо этого вы можете нарисовать PNG-изображение на растровом изображении, например:

with Image_center.Picture.Bitmap do
begin
  Width := Image.Width;
  Height := Image.Height;
  Canvas.Draw(0,0, Image);
end;

После этого вы можете использовать растровое изображение в Image_center.Picture.Graphic или Image_center.Picture.Bitmap, чтобы делать все, что вы хотите,

Имейте в виду, однако, что таким образом вы потеряете любую прозрачность, которая была у вас на изображении PNG, и это не тривиально, но вы можете это сделать, если прочитаете Как получитьпрозрачность растрового изображения без необходимости сначала рисовать? .

...