Tja, nun habe ich PNG (auch teiltransparente) in die Routine eingebaut, BMP konvertiere ich nach JPEG damit es im Browser keine Probleme gibt und da bleibe ich bei GIF hängen!
Für GIF gibt es nur TFPReaderGIF, aber leider keinen TFPWriterGIF, gibt es da was, wenn auch nur Ansätze, oder muss ich für GIFs einen anderen Weg nehmen?
Anbei die erweiterte Testroutine:
Code: Alles auswählen
program resize;
{$APPTYPE CONSOLE}
{$MODE objfpc}{$H+}
 
uses
  Classes, SysUtils, FPImage, FPCanvas, FPImgCanv, FPReadJPEG, FPWriteJPEG,
  FPReadPNG, FPWritePNG, FPReadGIF, FPReadBMP;
 
function resize(const InFile, OutFile: string; const maxWidth, maxHeight: word): boolean;
type TImgType = (itJPEG, itGIF, itPNG, itBMP);
var
  ext: string;
  it: TImgType;
  AWidth, AHeight: word;
  Image, DestImage: TFPMemoryImage;
  Canvas: TFPImageCanvas;
  Reader: TFPCustomImageReader;
  Writer: TFPCustomImageWriter;
  StartTime: DWord;
begin
  result := false;
  StartTime := GetTickCount();
  ext := LowerCase(ExtractFileExt(InFile));
  if (ext = '.jpg') or (ext = '.jpeg') then it := itJPEG
  else if (ext = '.png') then it := itPNG
  else if (ext = '.gif') then it := itGIF
  else if (ext = '.bmp') then it := itBMP
  else Exit;
  AWidth := maxWidth;
  AHeight := maxHeight;
  Image := TFPMemoryImage.Create(0, 0);
  try
    case it of
    itJPEG: Reader := TFPReaderJPEG.Create;
    itPNG: Reader := TFPReaderPNG.Create;
    itGIF: Reader := TFPReaderGIF.Create;
    itBMP: Reader := TFPReaderBMP.Create;
    end;
    try
      case it of
      itJPEG: begin
                TFPReaderJPEG(Reader).Performance := jpBestQuality;//jpBestSpeed;
                TFPReaderJPEG(Reader).MinHeight := AHeight;
                TFPReaderJPEG(Reader).MinWidth := AWidth;
              end;
      end;
      Image.LoadFromFile(InFile, Reader);
    finally
      Reader.Free;
    end;
    WriteLn('Zeit nach (LoadImageFromFile): ' + IntToStr(GetTickCount() - StartTime));
    if AWidth = 0 then AWidth := Image.Width;
    if AHeight = 0 then AHeight := Image.Height;
    // Scale image whilst preserving aspect ratio
    if (Image.Width / Image.Height) > (AWidth / AHeight) then
      AHeight := Round(AWidth / (Image.Width / Image.Height))
    else if (Image.Width / Image.Height) < (AWidth / AHeight) then
      AWidth := Round(AHeight * (Image.Width / Image.Height));
    WriteLn('Resizing images to: ' + IntToStr(AWidth) + 'x' + IntToStr(AHeight));
    DestImage := TFPMemoryImage.Create(AWidth, AHeight);
    try
      Canvas := TFPImageCanvas.Create(DestImage);
      try
        Canvas.StretchDraw(0, 0, AWidth, AHeight, Image);
      finally
        Canvas.Free;
      end;
      WriteLn('Zeit nach (ResizeImage): ' + IntToStr(GetTickCount() - StartTime));
      case it of
      itJPEG: Writer := TFPWriterJPEG.Create;
      itPNG: Writer := TFPWriterPNG.Create;
      itGIF: Writer := TFPWriterPNG.Create; //<----mein Problem
      itBMP: Writer := TFPWriterJPEG.Create;
      end;
      try
        case it of
        itJPEG, itBMP: begin
                  TFPWriterJPEG(Writer).CompressionQuality := 95;
                  TFPWriterJPEG(Writer).ProgressiveEncoding := true;
                end;
        itPNG, itGIF : begin
                 TFPWriterPNG(Writer).UseAlpha := true;
               end;
        end;
        DestImage.SaveToFile(OutFile, Writer);
        result := true;
      finally
        Writer.Free;
      end;
      WriteLn('Zeit nach (SaveImageToFile): ' + IntToStr(GetTickCount() - StartTime))
    finally
      DestImage.Free;
    end;
  finally
    Image.free;
  end;
end;
 
var sPath: string;
begin
  sPath := ExtractFilePath(ParamStr(0));
  resize(sPath + 'Tiger.bmp', sPath + 'Tiger~.jpg', 350, 200);
end.