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;