в данном случае не совсем так, что TImage это не картинка. если она не содержит никакого графического объекта (Picture.Graphic), т.е. была только что создана, как в данном примере, то при обращении к ее Canvas
создается Bitmap, который становится ее графическим объектом Picture.Graphic. и вся дальнейшая отрисовка через Canvas идет на этом Bitmap. когда Bitmap создается, то его размеры берутся равными размеру самого TImage. но если меняются размеры TImage, то размеры уже существующего Bitmap
не меняются. и если рисовать на Canvas такого TImage, то даже при сворачивании или перемещении по нему другого окна картинка остается нормальной - Bitmap благополучно отрисовывается. чтобы после изменения размера TImage все было в порядке, нужно Picture.Graphic:=nil; таким образом создастся новый Bitmap с новыми размерами, но, естественно, со значениями по умолчанию для карандашей и кистей и.т.д.
разобраться в этом поможет исходник TImage:
Код:
property Canvas: TCanvas read GetCanvas;
function TImage.GetCanvas: TCanvas;
var
Bitmap: TBitmap;
begin
if Picture.Graphic = nil then
begin
Bitmap := TBitmap.Create;
try
Bitmap.Width := Width;
Bitmap.Height := Height;
Picture.Graphic := Bitmap;
finally
Bitmap.Free;
end;
end;
if Picture.Graphic is TBitmap then
Result := TBitmap(Picture.Graphic).Canvas
else
raise EInvalidOperation.Create(SImageCanvasNeedsBitmap);
end;
property Width: Integer read FWidth write SetWidth;
procedure TControl.SetWidth(Value: Integer);
begin
// не уведомляется Picture.Graphic об изменении размеров
SetBounds(FLeft, FTop, Value, FHeight);
Include(FScalingFlags, sfWidth);
end;