Incompréhensible...

Champy33 Messages postés 14 Date d'inscription jeudi 2 octobre 2008 Statut Membre Dernière intervention 19 mai 2011 - 9 oct. 2008 à 18:19
Champy33 Messages postés 14 Date d'inscription jeudi 2 octobre 2008 Statut Membre Dernière intervention 19 mai 2011 - 15 oct. 2008 à 18:29
Bonjour

Delphi 7 (Win32). Je n'y comprends rien. Je n'arrive pas à charger une image sur deux dans un TBitmap, malgré que la structure de ces fichiers soit parfaitement valide. Vérifié, car ces images s'ouvrent parfaitement avec tous les logiciels existants !
Aucun 'warning' à la compilation, mais j'obtiens toujours l'erreur 'EReadError' avec le commentaire 'Erreur de lecture du flux', ce qui ne m'avance pas beaucoup...

Voici le petit bout de code qui coince :

procedure TFVisuSkin.FormShow(Sender: TObject);
var
  Bit : TBitmap;
  str : String;
begin
  str:='D:\Detente\1946\PaintSchemes\Skins\A-20C\A20A_USAAF_1941.bmp';
  Bit:=TBitmap.Create;
  Bit.LoadFromFile(str);
end;

Merci d'avance pour votre aide.
Champy

10 réponses

Nicolas___ Messages postés 992 Date d'inscription jeudi 2 novembre 2000 Statut Membre Dernière intervention 24 avril 2013 1
9 oct. 2008 à 18:40
tu ne devrais pas placer ca dans le onShow
% aide : OnShow : Se produit quand la fiche est affichée (c'est-à-dire quand la propriété Visible de la fiche prend la valeur true).

si tu veux charger une image, place ton code dans un bouton , en oubliant pas de faire bit.free à la fin pour liberer ton TBitmap ...
0
Nicolas___ Messages postés 992 Date d'inscription jeudi 2 novembre 2000 Statut Membre Dernière intervention 24 avril 2013 1
9 oct. 2008 à 18:49
et si c'est pour mettre une image en fond de Form , tu fais comme ceci

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs;

type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure FormPaint(Sender: TObject);
  private
    bit : TBitmap;
  public
    { Déclarations publiques }
  end;

const
  // tu mets ici le nom de l'image a chargée
  IMAGE_FOND = '18554826.bmp';
  STRETCH_FOND = true;
var
  Form1: TForm1;
  Path : String;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
  Path := ExtractFilePath(Application.ExeName);
  bit := TBitmap.Create;
  bit.LoadFromFile(Path+IMAGE_FOND);
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  bit.Free;
end;

procedure TForm1.FormPaint(Sender: TObject);
begin

  if(STRETCH_FOND)then
    Canvas.StretchDraw(Rect(0,0,Width,Height),bit)
  else
    Canvas.Draw(0,0,bit);
end;

end.
0
Nicolas___ Messages postés 992 Date d'inscription jeudi 2 novembre 2000 Statut Membre Dernière intervention 24 avril 2013 1
9 oct. 2008 à 18:53
si tu veux savoir redimensionner sans que ca foire , ni clignote :

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs;

type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure FormPaint(Sender: TObject);
    procedure FormResize(Sender: TObject);
  private
    bit : TBitmap;
  public
    { Déclarations publiques }
  end;

const
  // tu mets ici le nom de l'image a chagéer
  IMAGE_FOND = '18554826.bmp';
  STRETCH_FOND = true;
var
  Form1: TForm1;
  Path : String;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
  Path := ExtractFilePath(Application.ExeName);
  bit := TBitmap.Create;
  bit.LoadFromFile(Path+IMAGE_FOND);
  DoubleBuffered := True;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  bit.Free;
end;

procedure TForm1.FormPaint(Sender: TObject);
begin
  if(STRETCH_FOND)then
    Canvas.StretchDraw(Rect(0,0,Width,Height),bit)
  else
    Canvas.Draw(0,0,bit);
end;

procedure TForm1.FormResize(Sender: TObject);
begin
    Invalidate;
end;

end.
0
Champy33 Messages postés 14 Date d'inscription jeudi 2 octobre 2008 Statut Membre Dernière intervention 19 mai 2011
9 oct. 2008 à 21:03
Merci Nicolas, mais ta manip ne marche pas...

Voici une application qui ne comporte qu'un seul bouton. On ne peut pas faire plus simple :

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
    private
    public
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
  Bit : TBitmap;
begin
  Bit:=TBitmap.Create;
  Bit.LoadFromFile('D:\Detente\1946\PaintSchemes\Skins\A-20C\A20A_USAAF_1941.bmp');
  Bit.Free;
end;

end.

He ben, ça coince encore lorsque je clique sur le bouton (EReadError...). On pourrait croire que le fichier est pourri... mais le plus ralant, c'est que ce BMP (et ce n'est pas le seul) s'ouvre sans problème avec PaintShop, PhotoShop, etc...
C'est vraiment un casse-tête incompréhensible !

:)
Champy
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
fbalien Messages postés 251 Date d'inscription dimanche 7 décembre 2003 Statut Membre Dernière intervention 11 novembre 2016
9 oct. 2008 à 21:27
Bonjour
vu le nom de votre fichier c'est une texture de Flight sim non ?
dans ce cas ce n'est pas un BMP lisible via Delphi directement
voir "Les images particulières" sur mon site http://francois.basso.9online.fr/Informatique/informatique.html
en allant sur la page les images BMP
j'avais commencé un soft pour pouvoir lire et modifier ces images

Cordialement
0
Champy33 Messages postés 14 Date d'inscription jeudi 2 octobre 2008 Statut Membre Dernière intervention 19 mai 2011
9 oct. 2008 à 23:47
Bonsoir

Bien vu. Ce sont en effet des images servant à 'habiller' des avions virtuels. Heureusement que je n'ai pas caché les répertoires que j'utilise réellement...On appelle ces fichiers des 'skins' dans le jargon local.
Mais qu'ont-ils donc de spécial qui les rend illisibles uniquement avec Delphi ?
Parce que, bizzarement, il suffit qu'on en charge un dans PaintShop, puis qu'on le sauvegarde sous un autre nom pour que Delphi l'accepte !

Merci dans tous les cas. Je vais voir ton site.
Champy
0
Champy33 Messages postés 14 Date d'inscription jeudi 2 octobre 2008 Statut Membre Dernière intervention 19 mai 2011
10 oct. 2008 à 00:11
Houlala, c'est bien compliqué pour mon petit neurone... mais très intéressant.

En bref, comment puis-je m'en sortir ? parce que le problème, c'est que j'ai environ 3000 images comme ça, que j'envisage de ranger de manière 'automatique' (par similitude de certaines zones). Alors, je ne me vois pas toutes les charger dans Paintshop pour les sauvegarder sous un autre nom... sinon, je ne vais faire que ça, jour et nuit, pendant 1 mois ! ou plus...
:)

Champy
0
fbalien Messages postés 251 Date d'inscription dimanche 7 décembre 2003 Statut Membre Dernière intervention 11 novembre 2016
10 oct. 2008 à 11:15
Bonjour

Attention le fait de l'enregistrer avec un autre soft fait perdre une partie des information stockés dans l'image
et donc les rendent certainement non  utilisable comme texture
Faut que je retrouve les sources qui me permettait d'ouvrir ces images

A+
0
Champy33 Messages postés 14 Date d'inscription jeudi 2 octobre 2008 Statut Membre Dernière intervention 19 mai 2011
10 oct. 2008 à 12:36
Bizarement, les fichiers enregistrés avec un autre soft, et qui en changent certainement un peu la structure, fonctionnent parfaitement dans le jeu, même si on en change la résolution ou le nombre de couleurs !
Je pense que l'auteur a du prévoir cette éventualité dans son jeu. Donc, son soft doit bien savoir différentier les différents 'formats' de bmp...

Merci
0
Champy33 Messages postés 14 Date d'inscription jeudi 2 octobre 2008 Statut Membre Dernière intervention 19 mai 2011
15 oct. 2008 à 18:29
Bonjour

A force de 'bricoler' pendant de longues heures d'énervement, j'ai enfin trouvé comment remédier à mon problème de chargement de certains fichiers bmp.
Il faut copier le fichier 'graphic.pas' d'origine dans son répertoire de sources, afin qu'il soit utilisé à la place de l'originel. Ensuite, il faut modifier le code d'une de ses procédures comme suit :

procedure TBitmap.ReadDIB(Stream: TStream; ImageSize: LongWord; bmf: PBitmapFileHeader);
...
...
          try
{$IFDEF LINUX}
            // I need to pre-touch the memory in 4096 byte increments to ensure
            // the read will succeed. WINE marks this memory as not present to
            // catch when we make changes to it. If we read directly into it
            // Linux will (correctly) terminate the read with a failure since an
            // exception occured during the read. We need to make sure these
            // exceptions are triggered in user space instead of kernel.
            for I := 1 to (ImageSize + 4095) div 4096 do
              PByteArray(BitsMem)^[(I - 1) * 4096] := 0;
{$ENDIF}
            //  !!! Il faut retirer 2 octets à l'ImageSize pour que ça marche !!!
            Stream.ReadBuffer(BitsMem^, ImageSize-2);

          except
            DeleteObject(BMHandle);
            raise;
          end;
...

Voilà. Après cette minuscule modification, les bmp 'normaux' se chargent toujours sans problème (tout du moins ceux que j'ai en magasin...), ainsi que ceux issus du jeu de simulation de vol IL2 FB.
En conclusion, je pense pouvoir avancer sans trop me tromper que le format de ces bmp ne respecte pas à la lettre un des standards 'normaux'. Néanmoins, je ne peux pas affirmer que les formats 'normaux' de bmp seront tous lus sans erreur suite à la modification que je propose.

Si ça peut arranger quelques développeurs...

Champy
0
Rejoignez-nous