diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/AbstractPackManager.java b/core/src/main/java/net/momirealms/craftengine/core/pack/AbstractPackManager.java index cc0be3102..e43115a29 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/pack/AbstractPackManager.java +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/AbstractPackManager.java @@ -43,6 +43,7 @@ import org.yaml.snakeyaml.Yaml; import org.yaml.snakeyaml.scanner.ScannerException; import javax.imageio.ImageIO; +import javax.imageio.ImageReader; import java.awt.image.BufferedImage; import java.io.*; import java.nio.charset.StandardCharsets; @@ -1150,6 +1151,9 @@ public abstract class AbstractPackManager implements PackManager { private byte[] optimizeImage(byte[] previousImageBytes) throws IOException { try (ByteArrayInputStream is = new ByteArrayInputStream(previousImageBytes)) { BufferedImage src = ImageIO.read(is); + if (src.getType() == BufferedImage.TYPE_CUSTOM) { + return previousImageBytes; + } ByteArrayOutputStream baos = new ByteArrayOutputStream(); new PngOptimizer(src).write(baos); return baos.toByteArray(); diff --git a/core/src/main/java/net/momirealms/craftengine/core/util/PngOptimizer.java b/core/src/main/java/net/momirealms/craftengine/core/util/PngOptimizer.java index 2308654ca..03e1a17b5 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/util/PngOptimizer.java +++ b/core/src/main/java/net/momirealms/craftengine/core/util/PngOptimizer.java @@ -94,37 +94,22 @@ public class PngOptimizer { private BufferedImage convertTo8BitRGB(BufferedImage src) { int type = src.getType(); - if (type == BufferedImage.TYPE_INT_ARGB || - type == BufferedImage.TYPE_INT_RGB || - type == BufferedImage.TYPE_BYTE_INDEXED) { - return src; - } - - BufferedImage eightBitImage = new BufferedImage( - src.getWidth(), - src.getHeight(), - src.getColorModel().hasAlpha() ? BufferedImage.TYPE_INT_ARGB : BufferedImage.TYPE_INT_RGB - ); - - // 32 bit 位深 -> 8 bit 位深 - if (type == BufferedImage.TYPE_4BYTE_ABGR || type == BufferedImage.TYPE_4BYTE_ABGR_PRE) { - for (int y = 0; y < src.getHeight(); y++) { - for (int x = 0; x < src.getWidth(); x++) { - int rgb = src.getRGB(x, y); - eightBitImage.setRGB(x, y, rgb); - } - } + if (type == BufferedImage.TYPE_BYTE_GRAY || type == BufferedImage.TYPE_USHORT_GRAY) { + BufferedImage eightBitImage = new BufferedImage( + src.getWidth(), + src.getHeight(), + BufferedImage.TYPE_4BYTE_ABGR + ); + Graphics2D g2d = eightBitImage.createGraphics(); + g2d.setRenderingHint(RenderingHints.KEY_COLOR_RENDERING, RenderingHints.VALUE_COLOR_RENDER_QUALITY); + g2d.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY); + g2d.setRenderingHint(RenderingHints.KEY_DITHERING, RenderingHints.VALUE_DITHER_DISABLE); + g2d.setRenderingHint(RenderingHints.KEY_ALPHA_INTERPOLATION, RenderingHints.VALUE_ALPHA_INTERPOLATION_QUALITY); + g2d.drawImage(src, 0, 0, null); + g2d.dispose(); return eightBitImage; } - - Graphics2D g2d = eightBitImage.createGraphics(); - g2d.setRenderingHint(RenderingHints.KEY_COLOR_RENDERING, RenderingHints.VALUE_COLOR_RENDER_QUALITY); - g2d.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY); - g2d.setRenderingHint(RenderingHints.KEY_DITHERING, RenderingHints.VALUE_DITHER_DISABLE); - g2d.setRenderingHint(RenderingHints.KEY_ALPHA_INTERPOLATION, RenderingHints.VALUE_ALPHA_INTERPOLATION_QUALITY); - g2d.drawImage(src, 0, 0, null); - g2d.dispose(); - return eightBitImage; + return src; } private ImageData findBestFileStructure(BufferedImage src, ImageColorInfo info) throws IOException { diff --git a/gradle.properties b/gradle.properties index 5d77f81af..e89c90a04 100644 --- a/gradle.properties +++ b/gradle.properties @@ -39,7 +39,7 @@ zstd_version=1.5.7-4 commons_io_version=2.20.0 commons_lang3_version=3.19.0 sparrow_nbt_version=0.10.6 -sparrow_util_version=0.58 +sparrow_util_version=0.60 fastutil_version=8.5.18 netty_version=4.1.127.Final joml_version=1.10.8