Filipe35
Messages postés470Date d'inscriptionvendredi 14 novembre 2003StatutMembreDernière intervention23 octobre 2007
-
4 mars 2006 à 00:08
Filipe35
Messages postés470Date d'inscriptionvendredi 14 novembre 2003StatutMembreDernière intervention23 octobre 2007
-
16 mai 2006 à 14:26
Bonjour à tous,
je souhaiterais convertir des bmp en jpg
j'ai testé les 2 codes suivants
nom := 'bob.bmp'; new := 'bob.jpg';
bmp := TBitmap.Create;
jpg := TJpegImage.Create;
// Le bitmap est lu
bmp.LoadFromFile(nom);
// La qualité choisie détermine le rendu de l'image et
// la taille prise sur le disque
jpg.CompressionQuality:=95;
// Image en couleur
jpg.GrayScale:=False;
// Copie du BMP dans le JPG
jpg.Assign(bmp);
// Et sauvegarde du JPG
jpg.SaveToFile(new);
Finally
jpg.Free;
bmp.Free;
End;
Le résultat de ces 2 codes est que l'image jpg est à forte dominante verte et inexploitable
f0xi
Messages postés4205Date d'inscriptionsamedi 16 octobre 2004StatutModérateurDernière intervention12 mars 202235 7 mars 2006 à 18:11
je me suis repencher sur le probleme.
et j'ai trouver que :
la signature d'un bitmap guildwars est de 38 octets ... contre 36 pour un bitmap normal.
donc decalage des couleurs.
voici deux fonctions qui te seront utile :
// recupere la taille d'un fichier
function SizeOfFile(filename : string) : int64;
var f : file of byte;
begin
result := 0;
try
AssignFile(f,FileName);
Reset(f);
result :=FileSize(f);
finally
closefile(f);
end;
end;
// transforme un bitmap GW en bitmap
function BMPGWtoBMP(filename : string) : string;
var x : integer;
s : int64;
fs,fd : file of byte;
c : byte;
n : string;
begin
// on recupere la taille du fichier
s := SizeOfFile(FileName);
// on crée le nom du fichier bmp temporaire
x := 0;
while fileexists('c:\bmpgw'+inttostr(x)+'.bmp') do inc(x);
n := 'c:\bmpgw'+inttostr(x)+'.bmp';
try
// on assigne et ouvre la source
AssignFile(fs,FileName);
reset(fs);
// on assigne et crée la source
AssignFile(fd,n);
rewrite(fd);
// la petite boucle lourdingue
for x := 1 to s do begin
// on lit le fichier
read(fs,c);
// on jump les deux octet genants
if (X <> 37) and (X <> 38) then write(fd,c);
end;
finally
// on ferme les fichiers
closefile(fs);
closefile(fd);
// on renvois le nom du fichier temporaire
result := n;
end;
end;
et dans la procedure d'ouverture du fichier :
procedure TForm1.Button1Click(Sender: TObject);
var tmp : string;
begin
if opendialog1.Execute then begin
if lowercase(extractfileext(opendialog1.FileName)) = '.bmp' then begin
{ ouverture du bitmap }
if GWCheckBox.Checked then begin
tmp := BMPGWtoBMP(opendialog1.FileName);
bmp.LoadFromFile(tmp);
else
bmp.LoadFromFile(opendialog1.filename);
{ insertion du bitmap }
jpg.PixelFormat := jf8bit;
jpg.Compress; // appeler Compress a chaque modification de l'image
jpg.Assign(bmp); // assigne le bitmap
jpg.JPEGNeeded; // reinscrit les données jpeg
<hr size="2" width="100%">La theorie c'est quand on sait tout, mais que rien ne fonctionne.
La pratique c'est quand tout fonctionne, mais que personne ne sait pourquoi.
<hr>
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
jpg.Free;
bmp.Free;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
if opendialog1.Execute then begin
if lowercase(extractfileext(opendialog1.FileName)) = '.bmp' then begin
{ ouverture du bitmap }
bmp.LoadFromFile(opendialog1.FileName);
{ insertion du bitmap }
jpg.PixelFormat := jf24bit;
jpg.Compress; // appeler Compress a chaque modification de l'image
jpg.Assign(bmp); // assigne le bitmap
jpg.JPEGNeeded; // reinscrit les données jpeg
procedure TForm1.Button3Click(Sender: TObject);
begin
if savedialog1.Execute then begin
jpg.Compress; // un dernier coups pour etre sur de l'avoir fait
jpg.SaveToFile(savedialog1.FileName);
end;
end;
<hr size="2" width="100%">La theorie c'est quand on sait tout, mais que rien ne fonctionne.
La pratique c'est quand tout fonctionne, mais que personne ne sait pourquoi.
<hr>
f0xi
Messages postés4205Date d'inscriptionsamedi 16 octobre 2004StatutModérateurDernière intervention12 mars 202235 8 mars 2006 à 16:55
tout simplement en editant l'image a l'aide d'un editeur hexadecimal ...
<hr size="2" width="100%">La theorie c'est quand on sait tout, mais que rien ne fonctionne.
La pratique c'est quand tout fonctionne, mais que personne ne sait pourquoi.
<hr>
f0xi
Messages postés4205Date d'inscriptionsamedi 16 octobre 2004StatutModérateurDernière intervention12 mars 202235 13 mai 2006 à 03:59
methode moins lourde ...
on appel le nom de l'image a convertir et on recupere le nom du fichier convertis...
on utilise les tfilestream pour aller plus vite et copier des bloc de donnée important (dans notre cas des fichiers de 2 a 3Mo)
en cas d'erreur (si le fichier n'existe pas) la fonction ne renvois rien.
function GW2BMP(const FileName : string) : string;
var Src,Dest : TFileStream;
begin
result := '';
if fileexists(FileName) then begin
result := ExtractFilePath(FileName)+'cnv_'+ExtractFileName(FileName);
Src := TFileStream.Create(FileName,fmOpenRead);
Dest := TFileStream.Create(result,fmCreate);