macpc
Messages postés12Date d'inscriptionjeudi 9 octobre 2003StatutMembreDernière intervention 2 juin 2006
-
1 juin 2006 à 23:40
cs_Ricquet
Messages postés20Date d'inscriptionmardi 13 février 2007StatutMembreDernière intervention30 novembre 2010
-
25 juin 2009 à 14:31
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 -->
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...
f0xi
Messages postés4205Date d'inscriptionsamedi 16 octobre 2004StatutModérateurDernière intervention12 mars 202235 2 juin 2006 à 04:01
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.
cs_Kenavo
Messages postés702Date d'inscriptionvendredi 21 mars 2003StatutMembreDernière intervention 1 octobre 20095 2 juin 2006 à 10:30
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é)
cs_Ricquet
Messages postés20Date d'inscriptionmardi 13 février 2007StatutMembreDernière intervention30 novembre 2010 25 juin 2009 à 14:31
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