Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Звук, графика и видео > Как рисовать на TImage


Автор: wesadex 26.12.2005, 15:20
Есть TImage, в котором загружена GIFка... при попытке рисовать на канве этого TImage вываливается EInvalidOperation дескать "Рисовать на канве можно только если Image содержит Bitmap"... Что-то ничего не нашел по данному вопросу, подскажите люди добрые, как реализуется сие простое действо (или не простое?)! smile

Автор: wesadex 26.12.2005, 16:10
EInvalidOperation: "Can only modify an image if it contains a bitmap" вызывает следующий код:
Код

unit frmMain;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, StdCtrls, RxGIF;

type
  TmainForm = class(TForm)
    Memo: TMemo;
    Button1: TButton;
    Button2: TButton;
    Image: TImage;
    OpenDialog: TOpenDialog;
    Button3: TButton;
    SaveDialog: TSaveDialog;
    ScrollBox: TScrollBox;
    ListBox: TListBox;
    procedure ImageMouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);

   ...

  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  mainForm: TmainForm;
  StartPt:TPoint;

implementation

{$R *.dfm}

procedure TmainForm.ImageMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  StartPt.X:=x;
  StartPt.y:=y;
  
  Image.Canvas.Rectangle(x,y,x+20,y+20); //Строка вызывающая исключение

end;

....

end.


Я видимо не дословный перевод сообщения привел, а зря... т.е. видимо оно жалуется на то, что Image не содердит Bitmap'ов... хотя картинка в него уже загружена!
Как думаете господа из-за чего этот траббл?

Автор: Snowy 26.12.2005, 16:28
Ну вот пример для jpeg'a:
Код

procedure TForm1.FormCreate(Sender: TObject);
var
  jpg: TJpegImage;
begin
  jpg:=TJpegImage.Create;
  jpg.LoadFromFile('C:\1.jpg');
  jpg.DIBNeeded;
  Image1.Picture.Bitmap.Assign(jpg);
  jpg.Free;
end;

Автор: wesadex 26.12.2005, 16:49
У меня гифы да и хочется понять суть проблемы... Картинка грузится в Image вот так:
Image.Picture.LoadFromFile(FileName);... очень не хочется утяжелять прогу разбором того, какой формат картинки грузим и индивидуальным способом загрузки - прога-то мелкая...

Автор: Snowy 26.12.2005, 17:05
Код

var
  bmp: TBitmap;
begin
  Image1.Picture.LoadFromFile('С:\1.jpg');
  bmp:=TBitmap.Create;
  bmp.Assign(Image1.Picture.Graphic);
  Image1.Picture.Bitmap.Assign(bmp);
  bmp.Free;
end;

Автор: wesadex 27.12.2005, 10:25
Спасибо - подходит для всех форматов, которые мне нужны - для Веб-изображений! smile
А все-таки кто-нибудь может объяснить почему вылезала эта ошибка?

Автор: Snowy 27.12.2005, 10:30
Ошибка вылезала, потому что изображение не было преобразовано в BitMap, а работало через адаптер.
Битмап по сути был пустой. Вообще не задействован.
В этом решении я беру изображение, созданое адаптером, кладу его в битмап.
А потом этот битмап назначаю обратно TImage.
В результате TImage отключает адаптер и работает как обычно напрямую с битмапом.

Автор: wesadex 27.12.2005, 14:37
Осознал, но вот что не укладывается в схему на мой взгляд: Пустой битмап может быть и тогда когда Image просто положили на форму, но в этой ситуации Image позволяется работать в канвой... или я просто чего-то не понимаю?

Автор: Snowy 27.12.2005, 14:42
Просто при работе с адаптером, имадж переключается на него, а битмап игнорирует.
Попытка рисовать на канве имаджа заканчивается неуспехом,
т.к. битмап недоступен - отображается информация адаптера, а она ридонли.
Можно попробовать рисовать на канве битмапа.
В данном случае, я думаю, адаптер просто отключится, картинка пропадет и активируется битмап.

Автор: wesadex 28.12.2005, 11:21
Так и было - пробовал пользовать Image1.Picture.Bitmap.Canvas - картинка пропадала, а на канве появлялся рисунок! Спасибо! smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)