Habe den Fehler in der Komponente (in PdfJpegImage.pas) gefunden, es wird immer ColorSpace DeviceRGB ins PDF geschrieben, auch wenn es ein Graustufen-JPEG ist. Der Reader findet dann natürlich nicht genug Daten. Alle Bilder, die in Deinem Beispiel nicht funktionieren, sind Graustufen-JPEGs.
Delphi-Quellcode:
// CreateImage
function TPdfJpegImage.CreateImage(AImage: TGraphic): TPdfImage;
begin
// check whether specified graphic is valid image.
if not (AImage
is TJpegImage)
then
raise EPdfInvalidValue.Create('
only jpeg image is allowed.');
result := TPdfImage.CreateStream(
nil);
with result
do
try
TJpegImage(AImage).SaveToStream(Stream);
with Attributes
do
begin
AddItem('
Type', TPdfName.CreateName('
XObject'));
AddItem('
Subtype', TPdfName.CreateName('
Image'));
// Hier auf Graustufen prüfen
If TJpegImage(Aimage).Grayscale
Then
AddItem('
ColorSpace', TPdfName.CreateName('
DeviceGray'))
Else
AddItem('
ColorSpace', TPdfName.CreateName('
DeviceRGB'));
// ursprünglich wird immer RGB geschrieben
AddItem('
Width', TPdfNumber.CreateNumber(AImage.Width));
AddItem('
Height', TPdfNumber.CreateNumber(AImage.Height));
AddItem('
BitsPerComponent', TPdfNumber.CreateNumber(8));
PdfArrayByName('
Filter').AddItem(TPdfName.CreateName('
DCTDecode'));
end;
except
result.Free;
raise;
end;
Gruß, teebee