From 1ddcafbdd23adb8354259660e25723449fb47855 Mon Sep 17 00:00:00 2001 From: Timo Date: Mon, 26 Apr 2021 19:01:01 +0300 Subject: [PATCH] cleaned up image code --- .../segmentation/PdfSegmentationService.java | 80 +++++++++++-------- 1 file changed, 48 insertions(+), 32 deletions(-) diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/segmentation/PdfSegmentationService.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/segmentation/PdfSegmentationService.java index d0e199d6..270f95e1 100644 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/segmentation/PdfSegmentationService.java +++ b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/segmentation/PdfSegmentationService.java @@ -149,14 +149,14 @@ public class PdfSegmentationService { } //merge images, if they are separated during pdf import, return new list of Pdfimages - private List processImages(List imageList){ - if (imageList.size() >1) { + private List processImages(List imageList) { + if (imageList.size() > 1) { List mergedList = new ArrayList<>(); int countElementsInList = 0; boolean beginImage = true; // a List of Boolean, true = candidate for merging, false = no merging - ArrayList candidatesList = getCandidatesList(imageList); + List candidatesList = getCandidatesList(imageList); // loop through list, if there are candidates for merging (true), merge images and add it to mergedList for (int i = 0; i < candidatesList.size(); i++) { @@ -164,29 +164,35 @@ public class PdfSegmentationService { if (beginImage) { //begin of image, merge two parts of imageList PdfImage mergedImage = mergeTwoImages(imageList.get(i), imageList.get(i + 1)); - mergedList.add(mergedImage); - countElementsInList++; + // image merge successful + if (mergedImage != null) { + mergedList.add(mergedImage); + countElementsInList++; + } } else { //middle of an image, merge current piece auf mergedList with image of imageList PdfImage mergedImage = mergeTwoImages(mergedList.get(countElementsInList - 1), imageList.get(i + 1)); - mergedList.set(countElementsInList - 1, mergedImage); + // image merge successful + if (mergedImage != null) { + mergedList.set(countElementsInList - 1, mergedImage); + } } beginImage = false; } else { // if the last candidate is false, then both images i and i+1 must be added - if (i == candidatesList.size()-1){ - if (countElementsInList> 0 && mergedList.get(countElementsInList-1) == imageList.get(i)){ - mergedList.add(imageList.get(i+1)); - }else { + if (i == candidatesList.size() - 1) { + if (countElementsInList > 0 && mergedList.get(countElementsInList - 1) == imageList.get(i)) { + mergedList.add(imageList.get(i + 1)); + } else { mergedList.add(imageList.get(i)); mergedList.add(imageList.get(i + 1)); } - }else { + } else { //first image is not splitted, add i to resultlist - if (beginImage){ + if (beginImage) { mergedList.add(imageList.get(i)); countElementsInList++; - }else { + } else { // i is the end of an image, add begin of new image mergedList.add(imageList.get(i + 1)); countElementsInList++; @@ -194,14 +200,15 @@ public class PdfSegmentationService { } } } - }return mergedList; - }else { + } + return mergedList; + } else { return imageList; } } - private PdfImage mergeTwoImages(PdfImage image1, PdfImage image2){ - PdfImage newPdfImage = null; + private PdfImage mergeTwoImages(PdfImage image1, PdfImage image2) { + // diese Angaben von getPosition scheinen nicht richtig zu sein, damit werden teile des Bildes abgeschnitten double width = image1.getPosition().getWidth(); double height1 = image1.getPosition().getHeight(); @@ -211,39 +218,48 @@ public class PdfSegmentationService { double img1width = image1.getImage().getWidth(); double img2height = image2.getImage().getHeight(); - BufferedImage mergedImage = new BufferedImage((int) img1width, (int) (img1height+ img2height), BufferedImage.TYPE_INT_RGB); - Graphics g = mergedImage.getGraphics(); + BufferedImage mergedImage = new BufferedImage((int) img1width, (int) (img1height + img2height), BufferedImage.TYPE_INT_RGB); + Graphics mergedImageGraphics = mergedImage.getGraphics(); try { - g.drawImage(image1.getImage(),0,0,null); - g.drawImage(image2.getImage(),0, (int) (img1height),null); + mergedImageGraphics.drawImage(image1.getImage(), 0, 0, null); + mergedImageGraphics.drawImage(image2.getImage(), 0, (int) (img1height), null); // set Image, Position and type for merged Image //set position for merged image with values of image1 and the height of both Rectangle2D pos = new Rectangle2D.Float(); - pos.setRect(image1.getPosition().getX(), image2.getPosition().getY(), width,height1+height2); - newPdfImage = new PdfImage(mergedImage,pos,0); + pos.setRect(image1.getPosition().getX(), image2.getPosition().getY(), width, height1 + height2); + PdfImage newPdfImage = new PdfImage(mergedImage, pos, image1.getPage()); // Graphics need to be disposed - newPdfImage.getImage().flush(); - newPdfImage.getImage().getGraphics().dispose(); + + image1.getImage().flush(); + image2.getImage().flush(); + + mergedImage.flush(); + mergedImageGraphics.dispose(); + + return newPdfImage; } catch (Exception e) { - e.printStackTrace(); + // failed to merge image + log.error("Failed to merge image", e); + return null; } - newPdfImage.setPage(image1.getPage()); - return newPdfImage; + + } //make a list of true and false, if the image is a candidate for merging - private ArrayList getCandidatesList(List imageList) { - ArrayList candidatesList = new ArrayList<>(); + private List getCandidatesList(List imageList) { + List candidatesList = new ArrayList<>(); for (int i = 0; i < imageList.size(); i++) { if (i >= 1) { candidatesList.add(isCandidateForMerging(imageList.get(i - 1), imageList.get(i))); } - }return candidatesList; + } + return candidatesList; } // evaluate if two images are candidates for merging, depending on their coordinates, width and height - private boolean isCandidateForMerging(PdfImage image1, PdfImage image2){ + private boolean isCandidateForMerging(PdfImage image1, PdfImage image2) { double x1 = image1.getPosition().getX(); double y1 = image1.getPosition().getY(); double width1 = image1.getPosition().getWidth();