FMX Seatle
GlobalUseDX et GlobalUseDirect2D par défaut : c'est Max 8192 x 8192, sinon le Create ou le SetSize déclenche une exception EBitmapSizeTooBig
GlobalUseDX et GlobalUseDirect2D à False : c'est Max 65535 x 65535, même règle ci-dessus
le TBitmap.SaveToFile passe par FMX.Canvas.D2D.TBitmapCodecWIC pour un fichier PNG et c'est IWICFormatConverter.Initialize qui retourne 80070057 E_INVALIDARG
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 procedure TForm1.Button1Click(Sender: TObject); var Image: TBitmap; begin Image := TBitmap.Create(); try with Image.CanvasClass do ShowMessage(Format('%d x %d',[GetAttribute(TCanvasAttribute.MaxBitmapSize), GetAttribute(TCanvasAttribute.MaxBitmapSize)])); finally Image.Free(); end; end;
Dommage le code de TBitmapCodecWIC.SaveToStream ne gère aucun HRESULT retourné, ça manque de soin tout ça !
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 procedure TForm1.Button1Click(Sender: TObject); var Image: TBitmap; begin Image := TBitmap.Create(); try Image.SetSize(32768, 16384); Image.Canvas.DrawLine(Point(0, 0), PointF(32767, 16383), 1); Image.SaveToFile('Big.PNG'); // Fichier vide finally Image.Free(); end; end;
GDI+ ne semble pas vouloir non plus dessiné même une simple ligne
Encore une fois, l'encapsulation n'exploite pas les valeurs retournées
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 procedure TForm1.Button1Click(Sender: TObject); var Image: TBitmap; begin Image := TBitmap.Create(); try Image.SetSize(32768, 16384); // 16383 ça passe Image.Canvas.Stroke.Color := TAlphaColorRec.Red; Image.Canvas.DrawLine(Point(0, 0), PointF(Image.Width - 1, Image.Height - 1), 0.75); // GdipDrawLine retourne InvalidParameter Image.Canvas.DrawLine(Point(Image.Width - 1, 0), PointF(0, Image.Height - 1), 0.75); ImageViewer1.Bitmap.Assign(Image); finally Image.Free(); end; end;
Partager