gnujpdf drawImage reverse fix

gnujpdf transparent images
This commit is contained in:
Jindra Petřík
2021-03-16 12:45:57 +01:00
parent 9571de6858
commit 7c9a3b059a
3 changed files with 117 additions and 3 deletions

File diff suppressed because one or more lines are too long

View File

@@ -59,6 +59,8 @@ public class PDFImage extends PDFStream implements ImageObserver, Serializable {
private Image img;
private String name;
private String mask;
/**
* Creates a new <code>PDFImage</code> instance.
*
@@ -72,11 +74,16 @@ public class PDFImage extends PDFStream implements ImageObserver, Serializable {
*
* @param img an <code>Image</code> value
*/
public PDFImage(Image img) {
public PDFImage(Image img, String mask) {
this();
this.mask = mask;
setImage(img, 0, 0, img.getWidth(this), img.getHeight(this), this);
}
public PDFImage(Image img) {
this(img, null);
}
/**
* Creates a new <code>PDFImage</code> instance.
*
@@ -87,13 +94,18 @@ public class PDFImage extends PDFStream implements ImageObserver, Serializable {
* @param h an <code>int</code> value
* @param obs an <code>ImageObserver</code> value
*/
public PDFImage(Image img, int x, int y, int w, int h, ImageObserver obs) {
public PDFImage(Image img, int x, int y, int w, int h, ImageObserver obs, String mask) {
this();
objwidth = w;
objheight = h;
this.mask = mask;
setImage(img, x, y, img.getWidth(this), img.getHeight(this), obs);
}
public PDFImage(Image img, int x, int y, int w, int h, ImageObserver obs) {
this(img, x, y, w, h, obs, null);
}
/**
* Get the value of width.
*
@@ -297,6 +309,9 @@ public class PDFImage extends PDFStream implements ImageObserver, Serializable {
os.write("\n/Height ".getBytes());
os.write(Integer.toString(height).getBytes());
os.write("\n/BitsPerComponent 8\n/ColorSpace /DeviceRGB\n".getBytes());
if (mask != null) {
os.write(("\n/SMask " + mask + "\n").getBytes());
}
// write the pixels to the stream
//System.err.println("Processing image "+width+"x"+height+" pixels");

View File

@@ -0,0 +1,99 @@
package gnu.jpdf;
import static gnu.jpdf.PDFImage.handlePixel;
import java.awt.Image;
import java.awt.image.ImageObserver;
import java.awt.image.PixelGrabber;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.zip.DeflaterOutputStream;
/**
*
* @author JPEXS
*/
public class PDFMask extends PDFStream implements ImageObserver {
private final Image img;
private int width;
private int height;
public PDFMask(Image img) {
super("/XObject");
this.img = img;
width = img.getWidth(this);
height = img.getHeight(this);
}
@Override
public boolean imageUpdate(Image img, int infoflags, int x, int y, int w, int h) {
if (infoflags == ImageObserver.WIDTH) {
width = w;
}
if (infoflags == ImageObserver.HEIGHT) {
height = h;
}
//return true;
//}
return false;
}
@Override
public void writeStream(OutputStream os) throws IOException {
ByteArrayOutputStream b = new ByteArrayOutputStream();
DeflaterOutputStream dos = new DeflaterOutputStream(b);
//,new Deflater(Deflater.BEST_COMPRESSION,true));
//buf.writeTo(dos);
int w = width;
int h = height;
int x = 0;
int y = 0;
int[] pixels = new int[w * h];
PixelGrabber pg = new PixelGrabber(img, x, y, w, h, pixels, 0, w);
try {
pg.grabPixels();
} catch (InterruptedException e) {
System.err.println("interrupted waiting for pixels!");
return;
}
if ((pg.getStatus() & ImageObserver.ABORT) != 0) {
System.err.println("image fetch aborted or errored");
return;
}
for (int j = 0; j < h; j++) {
for (int i = 0; i < w; i++) {
int p = pixels[j * w + i];
int alpha = 255 - (p >> 24) & 0xff;
dos.write(alpha);
}
}
dos.finish();
dos.close();
os.write("/Subtype /Image\n".getBytes());
os.write(("/Width " + width + "\n").getBytes());
os.write(("/Height " + height + "\n").getBytes());
os.write(("/BitsPerComponent 8\n").getBytes());
os.write(("/ColorSpace /DeviceGray\n").getBytes());
os.write(("/Decode [1 0]\n").getBytes());
// FlatDecode is compatible with the java.util.zip.Deflater class
os.write("/Filter /FlateDecode\n".getBytes());
os.write("/Length ".getBytes());
os.write(Integer.toString(b.size() + 1).getBytes());
os.write("\n>>\nstream\n".getBytes());
b.writeTo(os);
os.write("\n".getBytes());
os.write("endstream\nendobj\n".getBytes());
// Unlike most PDF objects, we dont call writeEnd(os) because we
// contain a stream
}
}