Cerco di caricare un'immagine in imgQInput (che è una TImage), assegnarla a TJpegImage, comprimerla (fattore di compressione 5) e mostrarla in imgQOutput (un'altra TImage). Ma non funziona. L'immagine in imgQOutput è la stessa dell'originale. Dovrebbe sembrare MOLTO pixelato a causa del fattore di compressione! La compressione funziona comunque, perché quando salgo il file JPEG su disco è molto piccolo.Impossibile comprimere l'immagine JPEG e mostrarla sullo schermo
JPG:= TJPEGImage.Create;
TRY
JPG.CompressionQuality:= trkQuality.Position;
JPG.Assign(imgQInput.Picture.Graphic);
CompressJpeg(JPG);
imgQOutput.Picture.Assign(JPG); <--------- something wrong here. the shown image is not the compressed image but the original one
FINALLY
FreeAndNil(JPG);
END;
function CompressJpeg(OutJPG: TJPEGImage): Integer;
VAR tmpQStream: TMemoryStream;
begin
tmpQStream:= TMemoryStream.Create;
TRY
OutJPG.Compress;
OutJPG.SaveToStream(tmpQStream);
OutJPG.SaveToFile('c:\CompTest.jpg'); <--------------- this works
Result:= tmpQStream.Size;
FINALLY
FreeAndNil(tmpQStream);
END;
end;
TJpegImage contiene sia il bitmap DIB che il JPegData, anche se il comprime funziona e il salvataggio in file/stream salva il JPeg compresso, assegnandolo a un TImage.Picture utilizza il DIB invece di lasciarvi con l'immagine originale, Vahid's la risposta funziona perché ha ricaricato lo JPeg indietro dal flusso, cancellando così il DIB. – Dampsquid
Grazie Dampsquid. C'è un altro modo per farlo senza ricaricarlo dal flusso? Come JpegNeeded o così? – Ampere
Non ne ho mai trovato uno, DIBNeeded ne crea uno solo se non ce n'è uno, e assegnando a un nuovo TJPegImage si assegna anche il DIB in modo che non funzioni neanche. – Dampsquid