Pb de conversion emf vers jpg de grandes images

Signaler
Messages postés
12
Date d'inscription
jeudi 9 octobre 2003
Statut
Membre
Dernière intervention
2 juin 2006
-
Messages postés
20
Date d'inscription
mardi 13 février 2007
Statut
Membre
Dernière intervention
30 novembre 2010
-
Bonsoir à tous,

Je suis confronté au problème suivant lors de la conversion de grandes images emf vers jpg, j'obtiens une erreur endofressources:
Pour réaliser cela, étant donné qu'il n'est pas possible de dessiner directement dans le jpg (il ne possède pas de canvas), j'utilise un bitmap intermédiaire suivant le code ci-dessous:
<!-- BEGIN TEMPLATE: bbcode_code -->

Code :

try
MF := tmetafile.Create;
MF.Enhanced := true; MF.Width := largeur; MF.Height := hauteur;

MFcvs := TMetaFileCanvas.Create(mf, 0); //crée un canvas metafile
fGraph.Dessine(mfcvs, positionLeft, positionTop); //dessine dans le metafilecanvas
MFcvs .Free; //libère le mfcanvas et transfere dans metafile

if MF <> nil then
begin
sExt := ExtractFileExt(sNomFich); //récupère le format de fichier désiré
if (sExt '.bmp') or (sExt '.jpg') then
begin
bmp := TBitmap.Create;
try
bmp.PixelFormat := pf24bit; bmp.Width := mf.Width; bmp.Height := mf.Height;
bmp.Canvas.Draw(0, 0, mf);

if (sExt = '.bmp') then bmp.SaveToFile(sNomFich);

if (sExt = '.jpg') then
begin
JPEG := TJPEGImage.Create;
try
JPEG.CompressionQuality := JpegCompr;
JPEG.Assign(bmp);
JPEG.JPEGNeeded;
JPEG.SaveToFile(sNomFich);
finally
JPEG.Free;
end;
end;

finally
bmp.Free;
end;
end
end;
finally
MF.Free;
end;

<!-- END TEMPLATE: bbcode_code -->
Mes questions:
1- Existe-t'il une façon plus efficace pour réaliser cette conversion, n'utilisant pas éventuellement le bitmap qui génère le dépassement mémoire?
2- peut-on éviter d'utiliser la mémoire pour réaliser celà? (en passant par le disque par exemple)
3- est-ce que la notion de stream peut-être une piste?
4- existe-t'il une solution permettent de réserver l'espace nécessaire pour stocker le bitmap? (pouvant éventuellement dépasser la capacité mémoire)

ou toute autre idée, piste ou solution qui seront les bienvenues...

Merci

<!-- / message -->
<!-- edit note -->

5 réponses

Messages postés
4202
Date d'inscription
samedi 16 octobre 2004
Statut
Modérateur
Dernière intervention
13 juin 2020
37
parse error (300) : page is very too large.
parse error (124) : Comic font used.
parse error (129) : uncompatible element in user nick "macpc".

les images bitmap de delphi sont limitée a 2048x2048 pixels.
une image plus grande provoqueras l'erreur.
il faudrait plutot se tourner vers l'api G32 par exemple.
Messages postés
12
Date d'inscription
jeudi 9 octobre 2003
Statut
Membre
Dernière intervention
2 juin 2006

J'ai également fait l'essai d'affecter directement le MetaFile au Jpeg mais j'obtiens l'erreur: ' Impossible d'affecter TMetafile à TJPEGImage '

Peux-t'on affecter un metafile a un jpeg? Si oui de quelle manière sans utiliser un bitmap intermédiaire ?

'il faudrait plutot se tourner vers l'api G32 par exemple.' pourrais-tu etre plus précis? Merci
Messages postés
702
Date d'inscription
vendredi 21 mars 2003
Statut
Membre
Dernière intervention
1 octobre 2009
4
fOxi, tu m'étonnes ! La seule limite que j'ai trouvée au bitmap est effectivement la taille de mémoire physique disponible,
ce qui m'a permis de créer des images de plus de 10 000 x 10 000 pixels (24 bits / pixel) soit 300 Mo ! (avec 1 Go installé)






Ken@vo




<hr size="2" width="100%" />



Code, Code, Codec !






[%3C/body
]
Messages postés
4202
Date d'inscription
samedi 16 octobre 2004
Statut
Modérateur
Dernière intervention
13 juin 2020
37
ah oui ??

bizarre ... sur mon delphi 7 les images BMP superieure a 2048x2048 ne passe pas ...

a moins que ce soit photoshop 9 qui foute le brin avec les images superieure a 2048x2048 ... c'est bien possible aussi.
Messages postés
20
Date d'inscription
mardi 13 février 2007
Statut
Membre
Dernière intervention
30 novembre 2010

dans ton code tu écris :
JPEG.CompressionQuality := JpegCompr;
C'est probablement ce qui pose pb !
il suffit de créer une boucle while dans laquelle
tu décrémentes la compression => dec(Jpeg.compressionQuality, 10);
jusqu'à une valeur seuil par exemple 20.
ainsi, si ton jpegCompr vaut 90 au départ,
ta procédure tente de sauver le jpg et si échec
renouvelle avec compression plus forte et donc qualité moindre
au final, ton jpg finira par être sauvegarder
(je le fais réguliérement avec du 7Méga pixels)
Eric