2015-12-16 1 views
1

Je travaille sur delphi xe7 avec firemonkey et test sur android. Lorsque je travaille sur un appareil ayant une résolution normale de 1 (scene.scale = 1), les composants tels que TRoundRect, TPie, etc produisent des résultats laids car ils ne sont pas anti-aliasés (ou l'anti-alias n'est pas visible par les yeux humains). Si je travaille sur un périphérique haute définition (scene.scale = 2 par exemple), alors ce n'est pas vraiment un gros problème car la haute définition compense le problème.Comment travailler avec anti-alias sur delphi firemonkey et android


Donc, la première question est de savoir comment faire pour que ces composants produisent un graphique anti-alias? aussi comment dessiner directement sur la toile un disque anti-aliased (avec une image dedans)? Maintenant, quand je travaille sur bitmap et sur canvas, je remarque que FillText produit un résultat anti-aliasing. C'est en quelque sorte bon pour ce que je veux auparavant (pour disque) mais un peu de désastre pour le texte car c'est de les "flouter". c'est encore pire quand je fais d'abord Mybitmap.canvas.FillText => produire un peu d'antialias et puis plus tard je fais MyPaintBox.canvas.DrawBitmap (MyBitmap) ça va ajouter encore plus d'anti-alias! le texte sera très flou à la fin :(il est fou pour moi que faire canvas.drawBitmap sans distorsion dans le srcRec et destRect pas copier le pixel exact de bitmap à la toile :(

donc c'est leur un manière à:

Appel canvas.FillText sans anti-alias ou pour configurer le niveau d'anti-alias call c anvas.DrawBitmap sans anti-alias du tout pixel copie parfaite de bitmap sur la toile

merci par.! avancez pour votre aide!


quelques solutions que je trouve aujourd'hui (et les leurs problèmes):

J'ai trouvé un moyen comment faire tous les contrôles visuels (de troundrect, etc.) avec anti-aliasing: set Tform.quality à HighQuality!

Mais maintenant im face à un autre problème très forte que je ne peux pas comprendre :( peut-être un bug dans delphi donc si quelqu'un peut regarder je serai très grâce à lui ...

lorsque vous avez besoin d'un toile pour la forme, il est créé par

TCanvasGpu.CreateFromWindow constructeur

(... Aquality: TCanvasQuality)

et ici la qualité est tirée de la MyForm.quality

maintenant le problème est l'esprit h TBITMAP :(identique au précédent lorsque nous avons besoin du canevas pour l'image bitmap créée

constructeur TCanvasGpu.CreateFromBitmap (.... AQualité: TCanvasQuality = TCanvasQuality.SystemDefault)

mais ici le problème de leur est pas de propriété du tout dans le bitmap pour configurer la qualité de la toile :(

donc j'essayer cette solution:

 aBitmap := Tbitmap.Create(w,h); 
     try 

      aCanvas := TCanvasManager.CreateFromBitmap(ABitmap, TCanvasQuality.HighQuality); 
      Try 

      aCanvas.BeginScene; 
      try 
       aCanvas.Fill.Kind := TbrushKind.solid; 
       acanvas.Fill.Color := $ff000000; 
       aCanvas.FillRect(TRectF.Create(0, 0, w, h), w/2, h/2, ALLcorners, 1); 

      finally 
       aCanvas.EndScene; 
      end; 

      Finally 
      aCanvas.Free; 
      End; 
      .... 

et je pensais que je aura maintenant sur mon bitmap le même effet antialiasing de ce que j'ai quand je dessine directement sur la toile de la forme? Absolument pas, rien ne change et j'ai toujours moche rond sans aucun anti-aliasing :(

ce que je manque


EDIT:

La seule option que je trouve pour le moment de retirer les anticrénelage est de rendre le bitmap 2 fois plus gros et le réduire après par 2x! fou :(mais l'algorithme de réduction supprimer l'aliasé ... mais le coût de tout cela est que la vitesse devient lente, surtout quand on sait que toute la fonction graphique doit être fait dans le fil principal :(

  • Maintenant, plus je pense plus je me dis que c'est fou d'avoir une bibliothèque graphique qui ne supporte pas le multi-thread! Je ne peux pas croire que c'est une exigence d'openGL et je pense maintenant de plus en plus En parlant du point précédent, même si openGL exigeait vraiment que toutes les routines graphiques soient faites dans le thread principal (mais je doute vraiment), je ne comprends pas pourquoi delphi ne propose pas et roid un autre TcanvasClass (autre que TcanvasGPU) qui supporte multithread! plus fou est que lorsque vous travaillez avec TCanvasGPU sur Tbitmap, le résultat sera en tout cas (comme vous pouvez le voir dans mon post précédent) différent de ce que vous aurez travailler avec TCanvasGPU sur le composant visuel! Maintenant, je cherche une fonction pour travailler directement sur les grilles de pixels (old school), ce qui me rendra possible de travailler en multi-thread. pour finir c'est la fonction que j'utilise pour dessiner mon bitmap mais comme cette fonction doit être appelée dans le thread principal, elle ralentit mon application (en particulier le défilement) ... donc si vous avez une idée de rendre plus rapide ou multithread i prendre :)

    function DrawAdvertBitmap: Tbitmap; 
    var aBitmapAliased: Tbitmap; 
    begin 
    
        aBitmapAliased := Tbitmap.Create(trunc(FWidth * fScreenScale) * 2, trunc(FHeight * fScreenScale) * 2); 
    
        try 
    
        aBitmapAliased.Canvas.BeginScene; 
        try 
    
         aBitmapAliased.canvas.Clear(0); 
         aBitmapAliased.canvas.Fill.Color := $ff000000; 
         aBitmapAliased.Canvas.Fill.Kind := TbrushKind.Solid; 
         aBitmapAliased.Canvas.FillRect(...); 
    
         aBitmapAliased.Canvas.Fill.Color := $ff333844; 
         aBitmapAliased.Canvas.Font.Family := 'Roboto-Bold'; 
         aBitmapAliased.Canvas.Font.Size := 12 * fScreenScale * 2; 
         aBitmapAliased.Canvas.Font.Style := [TFontStyle.fsBold]; 
         aBitmapAliased.Canvas.FillText(...); 
    
        finally 
         aBitmapAliased.Canvas.EndScene; 
        end; 
    
        //reduce by 2 to make antialiased 
        result := Tbitmap.Create(trunc(FWidth * fScreenScale), trunc(FHeight * fScreenScale)); 
    
        try 
    
         result.Canvas.BeginScene; 
         try 
    
         result.Canvas.Clear(0); 
         result.Canvas.DrawBitmap(aBitmapAliased,...); 
    
         finally 
         result.Canvas.EndScene; 
         end; 
    
        except 
         result.Free; 
         raise; 
        end; 
    
        result.BitmapScale := fScreenScale; 
    
        finally 
        aBitmapAliased.free; 
        end; 
    
    end; 
    

Répondre

0

Si on parle de FireMonkey:

  1. TImage a la propriété "DisableInterpolation: booléen"
  2. TForm a la propriété "Qualité: TCanvasQuality = (SystemDefault, HighPerformance, HighQuality)" - il est des travaux dans la conception du temps

Important à savoir:

  1. L'anti-aliasing est un fonctionnement très coûteux, il est désactivé par défaut sur les plates-formes mobiles.
  2. Le même anticrénelage doit être pris en charge par le périphérique.Pour prendre en charge le multi-échantillonnage, OpenGL doit posséder la propriété GL_EXT_multisampled_render_to_texture. Si le matériel de l'appareil ne supporte pas le multi-échantillonnage, l'AA ne le sera pas.