Pull request #150: cleaned up image code

Merge in RED/redaction-service from image-cleanup to master

* commit '1ddcafbdd23adb8354259660e25723449fb47855':
  cleaned up image code
This commit is contained in:
Timo Bejan 2021-04-26 18:35:14 +02:00
commit f7af37d287

View File

@ -149,14 +149,14 @@ public class PdfSegmentationService {
} }
//merge images, if they are separated during pdf import, return new list of Pdfimages //merge images, if they are separated during pdf import, return new list of Pdfimages
private List<PdfImage> processImages(List<PdfImage> imageList){ private List<PdfImage> processImages(List<PdfImage> imageList) {
if (imageList.size() >1) { if (imageList.size() > 1) {
List<PdfImage> mergedList = new ArrayList<>(); List<PdfImage> mergedList = new ArrayList<>();
int countElementsInList = 0; int countElementsInList = 0;
boolean beginImage = true; boolean beginImage = true;
// a List of Boolean, true = candidate for merging, false = no merging // a List of Boolean, true = candidate for merging, false = no merging
ArrayList<Boolean> candidatesList = getCandidatesList(imageList); List<Boolean> candidatesList = getCandidatesList(imageList);
// loop through list, if there are candidates for merging (true), merge images and add it to mergedList // 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++) { for (int i = 0; i < candidatesList.size(); i++) {
@ -164,29 +164,35 @@ public class PdfSegmentationService {
if (beginImage) { if (beginImage) {
//begin of image, merge two parts of imageList //begin of image, merge two parts of imageList
PdfImage mergedImage = mergeTwoImages(imageList.get(i), imageList.get(i + 1)); PdfImage mergedImage = mergeTwoImages(imageList.get(i), imageList.get(i + 1));
mergedList.add(mergedImage); // image merge successful
countElementsInList++; if (mergedImage != null) {
mergedList.add(mergedImage);
countElementsInList++;
}
} else { } else {
//middle of an image, merge current piece auf mergedList with image of imageList //middle of an image, merge current piece auf mergedList with image of imageList
PdfImage mergedImage = mergeTwoImages(mergedList.get(countElementsInList - 1), imageList.get(i + 1)); 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; beginImage = false;
} else { } else {
// if the last candidate is false, then both images i and i+1 must be added // if the last candidate is false, then both images i and i+1 must be added
if (i == candidatesList.size()-1){ if (i == candidatesList.size() - 1) {
if (countElementsInList> 0 && mergedList.get(countElementsInList-1) == imageList.get(i)){ if (countElementsInList > 0 && mergedList.get(countElementsInList - 1) == imageList.get(i)) {
mergedList.add(imageList.get(i+1)); mergedList.add(imageList.get(i + 1));
}else { } else {
mergedList.add(imageList.get(i)); mergedList.add(imageList.get(i));
mergedList.add(imageList.get(i + 1)); mergedList.add(imageList.get(i + 1));
} }
}else { } else {
//first image is not splitted, add i to resultlist //first image is not splitted, add i to resultlist
if (beginImage){ if (beginImage) {
mergedList.add(imageList.get(i)); mergedList.add(imageList.get(i));
countElementsInList++; countElementsInList++;
}else { } else {
// i is the end of an image, add begin of new image // i is the end of an image, add begin of new image
mergedList.add(imageList.get(i + 1)); mergedList.add(imageList.get(i + 1));
countElementsInList++; countElementsInList++;
@ -194,14 +200,15 @@ public class PdfSegmentationService {
} }
} }
} }
}return mergedList; }
}else { return mergedList;
} else {
return imageList; return imageList;
} }
} }
private PdfImage mergeTwoImages(PdfImage image1, PdfImage image2){ private PdfImage mergeTwoImages(PdfImage image1, PdfImage image2) {
PdfImage newPdfImage = null;
// diese Angaben von getPosition scheinen nicht richtig zu sein, damit werden teile des Bildes abgeschnitten // diese Angaben von getPosition scheinen nicht richtig zu sein, damit werden teile des Bildes abgeschnitten
double width = image1.getPosition().getWidth(); double width = image1.getPosition().getWidth();
double height1 = image1.getPosition().getHeight(); double height1 = image1.getPosition().getHeight();
@ -211,39 +218,48 @@ public class PdfSegmentationService {
double img1width = image1.getImage().getWidth(); double img1width = image1.getImage().getWidth();
double img2height = image2.getImage().getHeight(); double img2height = image2.getImage().getHeight();
BufferedImage mergedImage = new BufferedImage((int) img1width, (int) (img1height+ img2height), BufferedImage.TYPE_INT_RGB); BufferedImage mergedImage = new BufferedImage((int) img1width, (int) (img1height + img2height), BufferedImage.TYPE_INT_RGB);
Graphics g = mergedImage.getGraphics(); Graphics mergedImageGraphics = mergedImage.getGraphics();
try { try {
g.drawImage(image1.getImage(),0,0,null); mergedImageGraphics.drawImage(image1.getImage(), 0, 0, null);
g.drawImage(image2.getImage(),0, (int) (img1height),null); mergedImageGraphics.drawImage(image2.getImage(), 0, (int) (img1height), null);
// set Image, Position and type for merged Image // set Image, Position and type for merged Image
//set position for merged image with values of image1 and the height of both //set position for merged image with values of image1 and the height of both
Rectangle2D pos = new Rectangle2D.Float(); Rectangle2D pos = new Rectangle2D.Float();
pos.setRect(image1.getPosition().getX(), image2.getPosition().getY(), width,height1+height2); pos.setRect(image1.getPosition().getX(), image2.getPosition().getY(), width, height1 + height2);
newPdfImage = new PdfImage(mergedImage,pos,0); PdfImage newPdfImage = new PdfImage(mergedImage, pos, image1.getPage());
// Graphics need to be disposed // 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) { } 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 //make a list of true and false, if the image is a candidate for merging
private ArrayList<Boolean> getCandidatesList(List<PdfImage> imageList) { private List<Boolean> getCandidatesList(List<PdfImage> imageList) {
ArrayList<Boolean> candidatesList = new ArrayList<>(); List<Boolean> candidatesList = new ArrayList<>();
for (int i = 0; i < imageList.size(); i++) { for (int i = 0; i < imageList.size(); i++) {
if (i >= 1) { if (i >= 1) {
candidatesList.add(isCandidateForMerging(imageList.get(i - 1), imageList.get(i))); 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 // 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 x1 = image1.getPosition().getX();
double y1 = image1.getPosition().getY(); double y1 = image1.getPosition().getY();
double width1 = image1.getPosition().getWidth(); double width1 = image1.getPosition().getWidth();