JPG и PNG в Bitmap

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Ответить
CynicRus
постоялец
Сообщения: 106
Зарегистрирован: 28.06.2012 14:31:11

JPG и PNG в Bitmap

Сообщение CynicRus »

Собственно - как реализовать сабж? Я пробовал следующим способом:

Код: Выделить всё

function JpegToBitmap(jpeg: string):TBitmap;
var
 jpg:TJpegImage;
 bmp:TBitmap;
 begin
   bmp := TBitmap.Create;
   jpg:=TJpegImage.Create;
   try
   jpg.LoadFromFile(jpeg);
   Bmp.Height      := jpg.Height;
   Bmp.Width       := jpg.Width;
   Bmp.PixelFormat := pf24bit;
   Bmp.Canvas.Draw(0, 0, jpg);
   bmp.Assign(jpg);
   result:=bmp;
   finally
     jpg.Free;
     bmp.Free;
   end;
 end;
function PngToBitmap(png: string):TBitmap;
var
  bmp: TBitmap;
  pic: TPortableNetworkGraphic;
begin
   bmp := TBitmap.Create;
   try
   pic.LoadFromFile(png);
   bmp.Assign(pic);
   result:=bmp;
   finally
     bmp.Free;
   end;
end;                   
но собственно потерпел фиаско. Получаю ошибку где-то в недрах picture.inc.
Win 7 + Lazarus 0.9.30.4 + fpc 2.6.0
Timid
постоялец
Сообщения: 290
Зарегистрирован: 21.11.2007 20:33:15

Сообщение Timid »

Как, интересно, Вы собирались отдать битмап (result:=bmp) после того как сделали ему Free? Операция присвоения для объектов не создает копию объектов, а только передает указатели.
Может попробовать как-то так:

Код: Выделить всё

begin
  ... (создаем и загружаем jpg) ...
  result:=TBitmap.Create;
  result.width:=320;
  result.height:=240;
  result.canvas.draw...
  ... (все остальное) ...
  jpg.free; // очистим память от jpeg'а, но не от битмапа, который в result'е !
end;
iskander
энтузиаст
Сообщения: 630
Зарегистрирован: 08.01.2012 18:43:34

Сообщение iskander »

Можно и проще:

Код: Выделить всё

  Result := TBitmap.Create;
  with TPicture.Create do
    try
      LoadFromFile(JPGFileName);//(PNGFileName)
      Result.Assign(Graphic);
    finally
      Free;
    end;
Ответить