Images demo

Submitted by eLenka on 4 August, 2010 - 15:38
Embedding image into SWF file

The example of embedding images of various formats (bmp, jpg, gif, png) to SWF.

Source archive: images.zip (1.67Mb)

 

Sample works

Some sample source: 
procedure TForm2.RGClick(Sender: TObject);
 var Movie: TFlashMovie;
     img: TFlashImage;
     fn: string;
     sh: TFlashShape;
     ilx, ily: integer;
     PB: ^Byte;
     XC, YC: integer;
{$IFDEF GIF}
   GIF: TGIFImage;
{$ENDIF}
{$IFDEF PNG}
   PNG: TPngObject;
   ZMem, Mem: TMemoryStream;
   Pal: TChunkPLTE;
   PNGC: TRGBQuad;
   Trans: TChunkTRNS;
   PNGP,
   PNGA: Pointer;
   DW: DWord;
{$ENDIF}
begin
 Screen.Cursor := crHourGlass;
 Movie := TFlashMovie.Create(0, 0, 450*twips, 350*twips, 10);
 Movie.Compressed := true;
 Movie.SystemCoord := scPix;
 
 sh := Movie.AddLine(0, 0, 450, 350);
 sh.SetLineStyle(1, swfRGB(clRed));
 Movie.PlaceObject(sh, 0);
 
 case RGImgType.ItemIndex of
  0: fn := '32.bmp';
  1: fn := '24.bmp';
  2: fn := '16.bmp';
  3: fn := '8.bmp';
  4: fn := 'gr.bmp';
  5: fn := '24.jpg';
  6..8: fn := '';
 end;
 img := Movie.AddImage(fn);
 
 case RGImgType.ItemIndex of
  6: begin
{$IFDEF GIF}
  GIF := TGIFImage.Create;
  GIF.LoadFromFile('8.gif');
  img.LoadDataFromHandle(GIF.Bitmap.Handle);
  if GIF.IsTransparent then
     IMG.SetAlphaColor( SWFRGBA(GIF.BackgroundColor, 0));
  GIF.Free;
{$ENDIF}
     end;
{$IFDEF PNG}
  7: begin
       PNG := TPngObject.Create;
       PNG.LoadFromFile('8.png');
       Pal := TChunkPLTE( PNG.Chunks.ItemFromClass(TChunkPLTE));
       Trans := TChunkTRNS( PNG.Chunks.ItemFromClass(TChunkTRNS));
       Mem := TMemoryStream.Create;
       Mem.SetSize(4 * Pal.Count + PNG.Width * PNG.Height);
       for ilx := 0 to Pal.Count - 1 do
        begin
          PNGC := Pal.Item[ilx];
          if Trans.PaletteValues[ilx] = 0 then
            begin
             Mem.Write(Trans.PaletteValues[ilx], 1);
             Mem.Write(Trans.PaletteValues[ilx], 1);
             Mem.Write(Trans.PaletteValues[ilx], 1);
            end else
            begin
              Mem.Write(PNGC.rgbRed, 1);
              Mem.Write(PNGC.rgbGreen, 1);
              Mem.Write(PNGC.rgbBlue, 1);
            end;
 
          Mem.Write(Trans.PaletteValues[ilx], 1);
        end;
 
       For ily := 0 to png.Height - 1 do
        begin
         PNGP := png.Scanline[ily];
         Mem.Write(PNGP^, PNG.Width);
        end;
 
       Mem.Position := 0;
       ZMem := TMemoryStream.Create;
       with TCompressionStream.Create(clDefault, ZMem) do
         begin
          CopyFrom(Mem, Mem.Size);
          free;
         end;
 
       IMG.LoadDataFromNativeStream(ZMem, false, Png.Width, Png.Height, BMP_8bit, Pal.Count, true);
       ZMem.Free;
       Mem.Free;
       PNG.Free;
     end;
  8:begin
       PNG := TPngObject.Create;
       PNG.LoadFromFile('32.png');
       Mem := TMemoryStream.Create;
       Mem.SetSize(PNG.Width * PNG.Height * 4);
       DW := 0;
       For ily := 0 to png.Height - 1 do
        begin
         PNGP := png.Scanline[ily];
         PNGA := png.AlphaScanline[ily];
         For ilx := 0 to png.Width - 1 do
           begin
             Mem.Write(pByteArray(PNGA)^[ilx], 1);
             if pByteArray(PNGA)^[ilx] = 0 then
               Mem.Write(DW, 3)
              else
               With pRGBLine(PNGP)^[ilx] do
                begin
                 Mem.Write(rgbtRed, 1);
                 Mem.Write(rgbtGreen, 1);
                 Mem.Write(rgbtBlue, 1);
                end;
           end;
        end;
       Mem.Position := 0;
       ZMem := TMemoryStream.Create;
       with TCompressionStream.Create(clDefault, ZMem) do
         begin
          CopyFrom(Mem, Mem.Size);
          free;
         end;
 
       IMG.LoadDataFromNativeStream(ZMem, false, Png.Width, Png.Height, BMP_32bitWork, 0, true);
       ZMem.Free;
       Mem.Free;
       PNG.Free;
    end;
{$ENDIF}
 end;
 
 if RGAlpha.Enabled then
   case RGAlpha.ItemIndex of
    0:;
    1:img.LoadAlphaDataFromFile('mask.bmp');
    2:begin
       XC := img.Width div 2;
       YC := img.Height div 2;
       if img.AsJPEG then
         begin
           img.MakeAlphaLayer;
           PB := img.AlphaData.Memory;
           For ily := img.Height - 1  downto 0 do
             For ilx := img.Width - 1 downto 0 do
               begin
                PB^ := 255 - Round(220 * ((Hypot( XC - ilx, YC - ily) / (YC - 20))));
                inc(PB);
               end;
         end else
         begin
           For ily := img.Height - 1  downto 0 do
             For ilx := img.Width - 1 downto 0 do
               img.AlphaPixel[ilx, ily] := 255 - Round(220 * ((Hypot( XC - ilx, YC - ily) / (YC - 20))));
         end;
      end;
     3: for ilx:= 70 to 140 do img.SetAlphaIndex(ilx, 0);
 
   end;
 
 sh := Movie.AddRectangle(0, 0, 400, 300);
 sh.SetImageFill(img,  fmTile {fmClip}  {fmFit});
 
 Movie.PlaceObject(sh, 1).SetTranslate(25, 25);
 
 Movie.ShowFrame;
 Movie.MakeStream;
 Movie.SaveToFile(demoName);
 Movie.Free;
 
 Player.Movie := tmpName;
 Screen.Cursor := crDefault;
 Player.Movie := demoName;
end;