On 11/08/2016 01:51 PM, Marc Santhoff wrote:
Hi,

if I want load a bitmap picture for extracting a small preview of it,
what component or library would be best?

My goal is to use pascal only without any external lirbraries if
possible. Second goal is to keep the program small, ideally avoiding to
link lcl controls in.

Bitmap picture may be anything commen, JPEG, PNG, GIF, BMP, etc.

TIA,
Marc


Hi I attached a small program I just wrote that resizes an image and saves it to a file. I didn't test it but it compiles. It uses just the png reader/writer components but there are several units for different image formats.

FPReadPNG, FPWritePNG
FPReadBMP, FPWriteBMP etc.

Regards,

Andrew Haines
program imageresize;
{$mode objfpc}
uses
  Classes, FPimage, FPImgCanv, FPCanvas, FPReadPNG, FPWritePNG;


function ResizeImage(ASrcImage: TFPCustomImage; ANewWidth, ANewHeight: 
Integer): TFPCustomImage;
var
  Canvas: TFPImageCanvas;
begin
  Result := TFPMemoryImage.Create(ANewWidth, ANewHeight);
  Canvas := TFPImageCanvas.Create(Result);

  Canvas.StretchDraw(0,0, ANewWidth, ANewHeight, ASrcImage);
  Canvas.Free;
end;

function ReadImage(AFileName: String) : TFPCustomImage;
var
  Stream: TMemoryStream;
  Reader: TFPReaderPNG;
begin
  Result := nil;
  Stream := TMemoryStream.Create;
  try
    Stream.LoadFromFile(AFileName);
    Stream.Seek(0, soBeginning);

    // I assume png for this example
    Reader := TFPReaderPNG.Create;

    Result := Reader.ImageRead(Stream, nil);
  finally
    Stream.Free;
    Reader.Free;
  end;
end;

procedure SaveImage(AImage: TFPCustomImage; AFileName: String);
var
  Writer: TFPWriterPNG;
  F: TFileStream;
begin
  F := TFileStream.Create(AFileName, fmCreate or fmOpenReadWrite);
  try
    Writer := TFPWriterPNG.Create;
    Writer.ImageWrite(F, AImage);
  finally
    Writer.Free;
    F.Free;
  end;
end;

var
  OrigImage,
  NewImage: TFPCustomImage;
begin
  if ParamCount < 2 then
  begin
    WriteLn('usage:');
    WriteLn('   imageresize input.png output.png');
  end;

  OrigImage := ReadImage(ParamStr(1));
  NewImage  := ResizeImage(OrigImage, 50, 50);

  SaveImage(NewImage, ParamStr(2));

  OrigImage.Free;
  NewImage.Free;
end.

_______________________________________________
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
http://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal

Reply via email to