public PdfImage(Image image, String name, PdfIndirectReference maskRef)
{
if (name == null)
GenerateImgResName(image);
else
this.name = new PdfName(name);
Put(PdfName.TYPE, PdfName.XOBJECT);
Put(PdfName.SUBTYPE, PdfName.IMAGE);
Put(PdfName.WIDTH, new PdfNumber(image.Width));
Put(PdfName.HEIGHT, new PdfNumber(image.Height));
if (image.Layer != null)
Put(PdfName.OC, image.Layer.Ref);
if (image.IsMask() && (image.Bpc == 1 || image.Bpc > 0xff))
Put(PdfName.IMAGEMASK, PdfBoolean.PDFTRUE);
if (maskRef != null) {
if (image.Smask)
Put(PdfName.SMASK, maskRef);
else
Put(PdfName.MASK, maskRef);
}
if (image.IsMask() && image.Inverted)
Put(PdfName.DECODE, new PdfLiteral("[1 0]"));
if (image.Interpolation)
Put(PdfName.INTERPOLATE, PdfBoolean.PDFTRUE);
Stream isp = null;
try {
// Raw Image data
if (image.IsImgRaw()) {
// will also have the CCITT parameters
int colorspace = image.Colorspace;
int[] transparency = image.Transparency;
if (transparency != null && !image.IsMask() && maskRef == null) {
StringBuilder s = new StringBuilder("[");
for (int k = 0; k < transparency.Length; ++k)
s.Append(transparency[k]).Append(' ');
s.Append(']');
Put(PdfName.MASK, new PdfLiteral(s.ToString()));
}
bytes = image.RawData;
Put(PdfName.LENGTH, new PdfNumber(bytes.Length));
int bpc = image.Bpc;
if (bpc > 0xff) {
if (!image.IsMask())
Put(PdfName.COLORSPACE, PdfName.DEVICEGRAY);
Put(PdfName.BITSPERCOMPONENT, new PdfNumber(1));
Put(PdfName.FILTER, PdfName.CCITTFAXDECODE);
int k = bpc - Image.CCITTG3_1D;
PdfDictionary decodeparms = new PdfDictionary();
if (k != 0)
decodeparms.Put(PdfName.K, new PdfNumber(k));
if ((colorspace & Image.CCITT_BLACKIS1) != 0)
decodeparms.Put(PdfName.BLACKIS1, PdfBoolean.PDFTRUE);
if ((colorspace & Image.CCITT_ENCODEDBYTEALIGN) != 0)
decodeparms.Put(PdfName.ENCODEDBYTEALIGN, PdfBoolean.PDFTRUE);
if ((colorspace & Image.CCITT_ENDOFLINE) != 0)
decodeparms.Put(PdfName.ENDOFLINE, PdfBoolean.PDFTRUE);
if ((colorspace & Image.CCITT_ENDOFBLOCK) != 0)
decodeparms.Put(PdfName.ENDOFBLOCK, PdfBoolean.PDFFALSE);
decodeparms.Put(PdfName.COLUMNS, new PdfNumber(image.Width));
decodeparms.Put(PdfName.ROWS, new PdfNumber(image.Height));
Put(PdfName.DECODEPARMS, decodeparms);
}
else {
switch (colorspace) {
case 1:
Put(PdfName.COLORSPACE, PdfName.DEVICEGRAY);
if (image.Inverted)
Put(PdfName.DECODE, new PdfLiteral("[1 0]"));
break;
case 3:
Put(PdfName.COLORSPACE, PdfName.DEVICERGB);
if (image.Inverted)
Put(PdfName.DECODE, new PdfLiteral("[1 0 1 0 1 0]"));
break;
case 4:
default:
Put(PdfName.COLORSPACE, PdfName.DEVICECMYK);
if (image.Inverted)
Put(PdfName.DECODE, new PdfLiteral("[1 0 1 0 1 0 1 0]"));
break;
}
PdfDictionary additional = image.Additional;
if (additional != null)
Merge(additional);
if (image.IsMask() && (image.Bpc == 1 || image.Bpc > 8))
Remove(PdfName.COLORSPACE);
Put(PdfName.BITSPERCOMPONENT, new PdfNumber(image.Bpc));
if (image.Deflated)
Put(PdfName.FILTER, PdfName.FLATEDECODE);
else {
FlateCompress(image.CompressionLevel);
}
}
return;
}
// GIF, JPEG or PNG
String errorID;
if (image.RawData == null){
WebRequest wr = WebRequest.Create(image.Url);
wr.Credentials = CredentialCache.DefaultCredentials;
isp = wr.GetResponse().GetResponseStream();
errorID = image.Url.ToString();
}
else{
isp = new MemoryStream(image.RawData);
errorID = "Byte array";
}
switch (image.Type) {
case Image.JPEG:
Put(PdfName.FILTER, PdfName.DCTDECODE);
switch (image.Colorspace) {
case 1:
Put(PdfName.COLORSPACE, PdfName.DEVICEGRAY);
break;
case 3:
Put(PdfName.COLORSPACE, PdfName.DEVICERGB);
break;
default:
Put(PdfName.COLORSPACE, PdfName.DEVICECMYK);
if (image.Inverted) {
Put(PdfName.DECODE, new PdfLiteral("[1 0 1 0 1 0 1 0]"));
}
break;
}
Put(PdfName.BITSPERCOMPONENT, new PdfNumber(8));
if (image.RawData != null){
bytes = image.RawData;
Put(PdfName.LENGTH, new PdfNumber(bytes.Length));
return;
}
streamBytes = new MemoryStream();
TransferBytes(isp, streamBytes, -1);
break;
case Image.JPEG2000:
Put(PdfName.FILTER, PdfName.JPXDECODE);
if (image.Colorspace > 0) {
switch (image.Colorspace) {
case 1:
Put(PdfName.COLORSPACE, PdfName.DEVICEGRAY);
break;
case 3:
Put(PdfName.COLORSPACE, PdfName.DEVICERGB);
break;
default:
Put(PdfName.COLORSPACE, PdfName.DEVICECMYK);
break;
}
Put(PdfName.BITSPERCOMPONENT, new PdfNumber(image.Bpc));
}
if (image.RawData != null){
bytes = image.RawData;
Put(PdfName.LENGTH, new PdfNumber(bytes.Length));
return;
}
streamBytes = new MemoryStream();
TransferBytes(isp, streamBytes, -1);
break;
case Image.JBIG2:
Put(PdfName.FILTER, PdfName.JBIG2DECODE);
Put(PdfName.COLORSPACE, PdfName.DEVICEGRAY);
Put(PdfName.BITSPERCOMPONENT, new PdfNumber(1));
if (image.RawData != null){
bytes = image.RawData;
Put(PdfName.LENGTH, new PdfNumber(bytes.Length));
return;
}
streamBytes = new MemoryStream();
TransferBytes(isp, streamBytes, -1);
break;
default:
throw new IOException(MessageLocalization.GetComposedMessage("1.is.an.unknown.image.format", errorID));
}
Put(PdfName.LENGTH, new PdfNumber(streamBytes.Length));
}
finally {
if (isp != null) {
try{
isp.Close();
}
catch {
// empty on purpose
}
}
}
}