2017-03-30 4 views
0

j'ai une image compressée je suis en train de le recevoir et de le montrer sur plate- d'Android, dans vlc je fais quelque chose comme suitTravailler avec JPG dans FireMonkey

procedure TForm1.CreateJpg(Data: string); 
var 
    JpegStream: TMemoryStream; 
    JpegImage: TJPEGImage; 
    Bitmap: TBitmap; 
    tmpPos, tmpLen: integer; 
    pp: string; 
begin 

    try 
    tmpPos := Pos('B]>', Data); 
    pp := Copy(Data, 5, tmpPos - 5); 
    tmpLen := StrToInt(pp); 
    Data := Copy(Data, tmpPos + 3, tmpLen); 
    Bitmap := TBitmap.Create; 

    try 
     JpegImage := TJPEGImage.Create; 

     try 
     JpegStream := TMemoryStream.Create; 

     try 
      TIdDecoderMIME.DecodeStream(Data, JpegStream); 
      JpegStream.Position := 0; 
      JpegImage.LoadFromStream(JpegStream); 
     finally 
      JpegStream.Free; 
     end; 

     with Bitmap do 
     begin 
      Canvas.Lock; 

      try 
      Width := JpegImage.Width; 
      Height := JpegImage.Height; 
      Canvas.StretchDraw(rect(0, 0, 200, 160), JpegImage); 
      finally 
      Canvas.Unlock; 
      end; 
     end; 
     finally 
     JpegImage.Free; 
     end; 

     img.Assign(Bitmap); 
    finally 
     Bitmap.Free; 
    end; 
    except 
    on E: Exception do 
     // 
    end; 
end; 

mais je ne peux pas faire la même chose dans Android parce qu'il n'y a pas de déclaration de TJPEGIMAGE bibliothèque Je ne sais pas si je peux faire quelque chose comme alternative de JPEG sur Fire-monkey je suis confus au sujet de ce que je dois faire

Répondre

1

La VCL utilise TGraphic les classes dérivée de pour gérer les types d'image individuels . Cependant, il n'y a aucun équivalent de TGraphic dans FireMonkey. Il n'a qu'une seule classe TBitmap qui prend en charge plusieurs types d'image. Différentes plates-formes FMX prennent en charge un sous-ensemble différent de types d'images (voir Supported Image Formats pour la liste complète). Heureusement, JPG est l'un des deux seuls types d'images supportés sur toutes les plateformes FMX (PNG est l'autre).

L'équivalent FMX de votre code VCL ressemblerait à quelque chose comme ceci:

procedure TForm1.CreateJpg(Data: string); 
var 
    JpegStream: TMemoryStream; 
    Jpeg, Bitmap: TBitmap; 
    tmpPos, tmpLen: integer; 
    pp: string; 
begin 
    try 
    tmpPos := Pos('B]>', Data); 
    pp := Copy(Data, 5, tmpPos - 5); 
    tmpLen := StrToInt(pp); 
    Data := Copy(Data, tmpPos + 3, tmpLen); 

    Bitmap := TBitmap.Create; 
    try 
     Jpeg := TBitmap.Create; 
     try 
     JpegStream := TMemoryStream.Create; 
     try 
      TIdDecoderMIME.DecodeStream(Data, JpegStream); 
      JpegStream.Position := 0; 
      Jpeg.LoadFromStream(JpegStream); 
     finally 
      JpegStream.Free; 
     end; 

     with Bitmap do 
     begin 
      SetSize(Jpeg.Width, Jpeg.Height); 

      if Canvas.BeginScene then 
      try 
      Canvas.DrawBitmap(Jpeg, 
       {$IF RTLVersion >= 31} // 10.1 Berlin or higher 
       Jpeg.BoundsF, 
       {$ELSE} 
       TRectF.Create(0, 0, Jpeg.Width, Jpeg.Height), 
       {$IFEND} 
       TRectF.Create(0, 0, 200, 160), 1.0); 
      finally 
      Canvas.EndScene; 
      end; 
     end; 
     finally 
     Jpeg.Free; 
     end; 

     img.Bitmap.Assign(Bitmap); 
    finally 
     Bitmap.Free; 
    end; 
    except 
    on E: Exception do 
     // 
    end; 
end; 
+0

merci remy, notez 'Jpeg.BoundsF' n'a pas membre appelé BoundsF –

+0

@ Vlark.Lopin: Je ne vous ai pas remarqué utilisaient Seattle. ['BoundsF'] (http://docwiki.embarcadero.com/Libraries/Berlin/fr/FMX.Graphics.TBitmap.BoundsF) a été ajouté à Berlin. –

+0

je pense que c'est dans la version tokyo seulement –