Search Results for

    Show / Hide Table of Contents

    TExcelFile.GetImageAlternate Method

    Returns an image and its type. Currently this method is the same as GetImage(Integer, string, TXlsImgType, TStream, Boolean) for all images except SVG. For SVG images, xlsx files store both a PNG and SVG image. In those cases, this method will return the SVG image. To get the PNG, call GetImage(Integer, string, TXlsImgType, TStream, Boolean)

    Syntax

    Unit: FlexCel.Core

    procedure TExcelFile.GetImageAlternate(const imageIndex: Integer; const objectPath: string; out imageType: TXlsImgType; const outStream: TStream; const usesObjectIndex: Boolean);

    Parameters

    <-> Parameter Type Description
    const imageIndex Integer Index of the image. (1 based)
    const objectPath string Object path to the image when it is a grouped image. For toplevel images you can use String.Empty.
    In other case, you need to use the value returned by GetObjectProperties(Integer, Boolean)
    Important: ObjectPath is ignored if usesObjectIndex is false.


    If it is "absolute"(it starts with "\"), then the path includes the objectIndex, and the objectIndex is not used. An object path of "\1\2\3" is exactly the same as using objectIndex = 1 and objectPath = "2\3"
    You might also use the name of the image as object path, like in xls.GetImage(-1, "@myimage", ref imageType, ImageStream, true)
    out imageType TXlsImgType Returns the image type for the data returned. (If it is a bmp, jpg or other)
    const outStream TStream Stream where the image data will be copied.
    const usesObjectIndex Boolean If false (the default) then imageIndex is an index to the list of images.
    When true imageIndex is an index to the list of all objects in the sheet. When you have the object id, you can avoid calling ObjectIndexToImageIndex which is a slow method, by setting this parameter to true.

    Examples

    The method "GetImageFromName" in the code below will extract an image in the active sheet if you know the name of the image. Note that the name must be a real name that was manually added to the image. Image names like "Image 1" might or might not work depending in the Excel version.

    The method "GetAllImagesInSheet" will loop over all the existing images in the active sheet and save them.

    function GetExtension(const ImgType: TXlsImgType): string;
    begin
      case ImgType of
        TXlsImgType.Bmp:
        begin
          exit('.bmp');
        end;
        TXlsImgType.Emf:
        begin
          exit('.emf');
        end;
        TXlsImgType.Jpeg:
        begin
          exit('.jpg');
        end;
        TXlsImgType.Wmf:
        begin
          exit('.wmf');
        end;
        TXlsImgType.Tiff:
        begin
          exit('.tif');
        end;
        TXlsImgType.Gif:
        begin
          exit('.gif');
        end;
        TXlsImgType.Png:
        begin
          exit('.png');
        end;
        else
        begin
          exit('');
        end;
      end;
    end;
    
    procedure GetImageFromName;
    var
      xls: TXlsFile;
      filename: string;
      imageType: TXlsImgType;
      ImageStream: TFileStream;
    begin
      xls := TXlsFile.Create('myfile.xlsx');
      try
        //Get an image named "myimage" and save it 
        //as myimage.png, myimage.jpeg, etc depending in the 
        //image type.
        filename := 'myimage';  
        imageType := TXlsImgType.Unknown;
        ImageStream := TFileStream.Create(filename, fmCreate);
        try
            xls.GetImage(-1, '@myimage', imageType, ImageStream, true);  //For this to work, last parameter must be true.
        finally
          ImageStream.Free;
        end;
        TFile.Move(filename, TPath.ChangeExtension(filename, GetExtension(imageType)));
      finally
        xls.Free;
      end;
    end;
    
    procedure GetAllImagesInSheet;
    var
      xls: TXlsFile;
      imageType: TXlsImgType;
      i: Int32;
      filename: string;
      ImageStream: TFileStream;
    begin
      xls := TXlsFile.Create('myfile.xlsx');
      try
         //Get all the images in the active sheet and save them
         //as myimage1.png, myimage2.jpeg, etc depending in the
         //image type.
        imageType := TXlsImgType.Unknown;
        for i := 1 to xls.ImageCount do
        begin
          filename := 'myimage' + IntToStr(i);
          ImageStream := TFileStream.Create(filename, fmCreate);
          try
            xls.GetImage(i, imageType, ImageStream);
          finally
            ImageStream.Free;
          end;
          TFile.Move(filename, TPath.ChangeExtension(filename, GetExtension(imageType)));
        end;
      finally
        xls.Free;
      end;
    
    end;
    

    See also

    • TExcelFile
    In This Article
    Back to top FlexCel Studio for VCL and FireMonkey v7.24
    © 2002 - 2025 tmssoftware.com