Skip to content

Commit f3ce671

Browse files
Make image scaling more resilient
1 parent 0723318 commit f3ce671

File tree

1 file changed

+13
-7
lines changed

1 file changed

+13
-7
lines changed

src/main/java/app/fyreplace/api/services/ImageService.java

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -61,23 +61,29 @@ public void validate(final byte[] data) throws UnsupportedMediaTypeException {
6161
}
6262

6363
public byte[] shrink(final byte[] data) {
64-
final var softMaxSize = fileMaxSize.asLongValue();
64+
return shrink(data, 1.5);
65+
}
66+
67+
private byte[] shrink(final byte[] data, final double scaleFactorIncrease) {
68+
final var maxSize = fileMaxSize.asLongValue();
6569

66-
if (data.length <= softMaxSize) {
70+
if (data.length <= maxSize) {
6771
return data;
6872
}
6973

7074
final var inputImage = new Image(data);
71-
final var scaleFactor = Math.sqrt((double) softMaxSize / data.length);
72-
inputImage.resize((int) (inputImage.getWidth() * scaleFactor), (int) (inputImage.getHeight() * scaleFactor));
75+
final var scaleFactor = Math.sqrt((double) data.length / maxSize) * scaleFactorIncrease;
76+
inputImage.resize((int) (inputImage.getWidth() / scaleFactor), (int) (inputImage.getHeight() / scaleFactor));
7377
inputImage.rotate();
7478
final var output = inputImage.getByteArray();
7579

76-
if (output.length > softMaxSize * 3) {
80+
if (output.length <= maxSize) {
81+
return output;
82+
} else if (scaleFactorIncrease >= 3) {
7783
throw new RequestEntityTooLargeException();
84+
} else {
85+
return shrink(data, scaleFactorIncrease + 0.5);
7886
}
79-
80-
return output;
8187
}
8288

8389
private ImageReader getFirstValidReader(final byte[] data) throws IOException {

0 commit comments

Comments
 (0)