Skip to content

Commit 0e355c4

Browse files
few gif image improvements
1 parent 997e39d commit 0e355c4

File tree

2 files changed

+56
-23
lines changed

2 files changed

+56
-23
lines changed

io/src/main/java/com/itextpdf/io/image/GifImageHelper.java

Lines changed: 18 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@
1515
public final class GifImageHelper {
1616

1717
static final int MaxStackSize = 4096; // max decoder pixel stack size
18-
private static int currentFrame;
1918

2019
private static class GifParameters {
2120
DataInputStream in;
@@ -55,16 +54,27 @@ private static class GifParameters {
5554
int m_line_stride;
5655
byte[] fromData;
5756
URL fromUrl;
57+
int currentFrame;
5858

5959
GifImage image;
6060
}
6161

62-
public static void processImage(GifImage image, ByteArrayOutputStream stream) {
63-
processImage(image, stream, -1);
62+
/**
63+
* Reads image source and fills GifImage object with parameters (frames, width, height)
64+
* @param image GifImage
65+
*/
66+
public static void processImage(GifImage image) {
67+
processImage(image, -1);
6468
}
6569

66-
public static void processImage(GifImage image, ByteArrayOutputStream stream, int lastFrameNumber) {
70+
/**
71+
* Reads image source and fills GifImage object with parameters (frames, width, height)
72+
* @param image GifImage
73+
* @param lastFrameNumber the last frame of the gif image should be read
74+
*/
75+
public static void processImage(GifImage image, int lastFrameNumber) {
6776
GifParameters gif = new GifParameters();
77+
ByteArrayOutputStream stream = new ByteArrayOutputStream();
6878

6979
gif.image = image;
7080

@@ -101,7 +111,7 @@ private static void process(InputStream is, GifParameters gif, int lastFrameNumb
101111
gif.in = new DataInputStream(new BufferedInputStream(is));
102112
readHeader(gif);
103113
readContents(gif, lastFrameNumber);
104-
if (currentFrame <= lastFrameNumber)
114+
if (gif.currentFrame <= lastFrameNumber)
105115
throw new IOException(IOException.CannotFind1Frame).setMessageParams(lastFrameNumber);
106116
}
107117

@@ -189,16 +199,16 @@ private static int newBpc(int bpc) {
189199
private static void readContents(GifParameters gif, int lastFrameNumber) throws java.io.IOException {
190200
// read GIF file content blocks
191201
boolean done = false;
192-
currentFrame = 0;
202+
gif.currentFrame = 0;
193203
while (!done) {
194204
int code = gif.in.read();
195205
switch (code) {
196206
case 0x2C: // image separator
197207
readFrame(gif);
198-
if (currentFrame == lastFrameNumber) {
208+
if (gif.currentFrame == lastFrameNumber) {
199209
done = true;
200210
}
201-
currentFrame++;
211+
gif.currentFrame++;
202212
break;
203213
case 0x21: // extension
204214
code = gif.in.read();

io/src/main/java/com/itextpdf/io/image/ImageFactory.java

Lines changed: 38 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -282,16 +282,15 @@ public static Image getBmpImage(byte[] bytes, boolean noHeader, int size) {
282282
}
283283

284284
/**
285-
* Return a GifImage object. This object cannot be
285+
* Return a GifImage object. This object cannot be added to a document
286286
* @param bytes
287287
* @return
288288
*/
289289
public static GifImage getGifImage(byte[] bytes) {
290290
byte[] imageType = readImageType(bytes);
291291
if (imageTypeIs(imageType, gif)) {
292292
GifImage image = new GifImage(bytes);
293-
ByteArrayOutputStream baos = new ByteArrayOutputStream();
294-
GifImageHelper.processImage(image, baos);
293+
GifImageHelper.processImage(image);
295294
return image;
296295
}
297296
throw new IllegalArgumentException("GIF image expected.");
@@ -307,8 +306,7 @@ public static Image getGifFrame(URL url, int frame) {
307306
byte[] imageType = readImageType(url);
308307
if (imageTypeIs(imageType, gif)) {
309308
GifImage image = new GifImage(url);
310-
ByteArrayOutputStream baos = new ByteArrayOutputStream();
311-
GifImageHelper.processImage(image, baos, frame - 1);
309+
GifImageHelper.processImage(image, frame - 1);
312310
return image.getFrames().get(frame - 1);
313311
}
314312
throw new IllegalArgumentException("GIF image expected.");
@@ -324,8 +322,7 @@ public static Image getGifFrame(byte[] bytes, int frame) {
324322
byte[] imageType = readImageType(bytes);
325323
if (imageTypeIs(imageType, gif)) {
326324
GifImage image = new GifImage(bytes);
327-
ByteArrayOutputStream baos = new ByteArrayOutputStream();
328-
GifImageHelper.processImage(image, baos, frame - 1);
325+
GifImageHelper.processImage(image, frame - 1);
329326
return image.getFrames().get(frame - 1);
330327
}
331328
throw new IllegalArgumentException("GIF image expected.");
@@ -341,9 +338,8 @@ public static List<Image> getGifFrames(byte[] bytes, int[] frameNumbers) {
341338
byte[] imageType = readImageType(bytes);
342339
if (imageTypeIs(imageType, gif)) {
343340
GifImage image = new GifImage(bytes);
344-
ByteArrayOutputStream baos = new ByteArrayOutputStream();
345341
Arrays.sort(frameNumbers);
346-
GifImageHelper.processImage(image, baos, frameNumbers[frameNumbers.length - 1] - 1);
342+
GifImageHelper.processImage(image, frameNumbers[frameNumbers.length - 1] - 1);
347343
List<Image> frames = new ArrayList<>();
348344
for (int frame : frameNumbers) {
349345
frames.add(image.getFrames().get(frame - 1));
@@ -363,9 +359,8 @@ public static List<Image> getGifFrames(URL url, int[] frameNumbers) {
363359
byte[] imageType = readImageType(url);
364360
if (imageTypeIs(imageType, gif)) {
365361
GifImage image = new GifImage(url);
366-
ByteArrayOutputStream baos = new ByteArrayOutputStream();
367362
Arrays.sort(frameNumbers);
368-
GifImageHelper.processImage(image, baos, frameNumbers[frameNumbers.length - 1] - 1);
363+
GifImageHelper.processImage(image, frameNumbers[frameNumbers.length - 1] - 1);
369364
List<Image> frames = new ArrayList<>();
370365
for (int frame : frameNumbers) {
371366
frames.add(image.getFrames().get(frame - 1));
@@ -375,6 +370,36 @@ public static List<Image> getGifFrames(URL url, int[] frameNumbers) {
375370
throw new IllegalArgumentException("GIF image expected.");
376371
}
377372

373+
/**
374+
* Returns <CODE>List</CODE> of gif image frames
375+
* @param bytes byte array of gif image
376+
* @return all frames of gif image
377+
*/
378+
public static List<Image> getGifFrames(byte[] bytes) {
379+
byte[] imageType = readImageType(bytes);
380+
if (imageTypeIs(imageType, gif)) {
381+
GifImage image = new GifImage(bytes);
382+
GifImageHelper.processImage(image);
383+
return image.getFrames();
384+
}
385+
throw new IllegalArgumentException("GIF image expected.");
386+
}
387+
388+
/**
389+
* Returns <CODE>List</CODE> of gif image frames
390+
* @param url url of gif image
391+
* @return all frames of gif image
392+
*/
393+
public static List<Image> getGifFrames(URL url) {
394+
byte[] imageType = readImageType(url);
395+
if (imageTypeIs(imageType, gif)) {
396+
GifImage image = new GifImage(url);
397+
GifImageHelper.processImage(image);
398+
return image.getFrames();
399+
}
400+
throw new IllegalArgumentException("GIF image expected.");
401+
}
402+
378403
public static Image getJbig2Image(URL url, int page) {
379404
if (page < 1)
380405
throw new IllegalArgumentException("The page number must be greater than 0");
@@ -508,8 +533,7 @@ private static Image getImageInstance(URL source, boolean recoverImage) {
508533
byte[] imageType = readImageType(source);
509534
if (imageTypeIs(imageType, gif)) {
510535
GifImage image = new GifImage(source);
511-
ByteArrayOutputStream baos = new ByteArrayOutputStream();
512-
GifImageHelper.processImage(image, baos, 0);
536+
GifImageHelper.processImage(image, 0);
513537
return image.getFrames().get(0);
514538
} else if (imageTypeIs(imageType, jpeg)) {
515539
Image image = new JpegImage(source);
@@ -553,8 +577,7 @@ private static Image getImageInstance(byte[] bytes, boolean recoverImage) {
553577
byte[] imageType = readImageType(bytes);
554578
if (imageTypeIs(imageType, gif)) {
555579
GifImage image = new GifImage(bytes);
556-
ByteArrayOutputStream baos = new ByteArrayOutputStream();
557-
GifImageHelper.processImage(image, baos, 0);
580+
GifImageHelper.processImage(image, 0);
558581
return image.getFrames().get(0);
559582
} else if (imageTypeIs(imageType, jpeg)) {
560583
Image image = new JpegImage(bytes);

0 commit comments

Comments
 (0)