0

info look like :

module ir.mehritco.megnatis.faststonecapture {
    requires javafx.controls;
    requires javafx.fxml;

    requires org.controlsfx.controls;
    requires org.kordamp.bootstrapfx.core;
    requires java.desktop;
    requires camera.framework;
    requires javafx.swing;
    requires org.apache.logging.log4j;
    requires org.apache.logging.log4j.core;
    requires org.json;
    requires org.xerial.sqlitejdbc;
    requires com.ibm.icu;
    requires camera.binding;
    requires com.sun.jna;
    requires org.apache.commons.imaging;
    requires org.apache.commons.io;

    opens ir.mehritco.megnatis.faststonecapture.gui to javafx.fxml;
    exports ir.mehritco.megnatis.faststonecapture.gui;
    exports ir.mehritco.megnatis.faststonecapture;
    opens ir.mehritco.megnatis.faststonecapture to
            javafx.fxml, org.apache.logging.log4j,
            org.apache.logging.log4j.core, org.json,
            org.xerial.sqlitejdbc, java.desktop;
    exports ir.mehritco.megnatis.faststonecapture.canon;
    opens ir.mehritco.megnatis.faststonecapture.opencv to javafx.graphics, javafx.fxml;

}

The Problem is, I need use class JPEGMetadata that is in JDK 17 under the com.sun.imageio.plugins.jpeg and java.desktop so I added The JPEGMetadata and As you can see The requires java.desktop; is present but I get error :

Exception in thread "Thread-6" java.lang.IllegalAccessError: class ir.mehritco.megnatis.faststonecapture.GraphicsPath (in module ir.mehritco.megnatis.faststonecapture) cannot access class com.sun.imageio.plugins.jpeg.JPEGMetadata (in module java.desktop) because module java.desktop does not export com.sun.imageio.plugins.jpeg to module ir.mehritco.megnatis.faststonecapture
    at ir.mehritco.megnatis.faststonecapture/ir.mehritco.megnatis.faststonecapture.GraphicsPath.lambda$exportImageToFile$2(GraphicsPath.java:606)
    at java.base/java.lang.Thread.run(Thread.java:833)

Idk what can I do to resolve it.

The part of Code that need this class:

new Thread(() -> {
                try {
                    App.logger.debug("Going to create Export With File : " + fileName);
                    BufferedImage scaleUpImage = scale(bufferedImage, BufferedImage.TYPE_INT_ARGB,
                            (int) convertMMToPx(theWidthOfBondClipInMM()), (int) convertMMToPx(theHeightOfBondClipInMM())
                            , convertMMToPx(theWidthOfBondClipInMM()) / bufferedImage.getWidth()
                            , convertMMToPx(theHeightOfBondClipInMM()) / bufferedImage.getHeight());

                    Iterator<ImageWriter> writers = ImageIO.getImageWritersByFormatName(ext);
                    while (writers.hasNext()) {
                        ImageWriter writer = writers.next();
                        ImageWriteParam writeParam = writer.getDefaultWriteParam();
                        ImageTypeSpecifier typeSpecifier = ImageTypeSpecifier.createFromBufferedImageType(BufferedImage.TYPE_INT_ARGB);
                        IIOMetadata metadata = writer.getDefaultImageMetadata(typeSpecifier, writeParam);
                        if (metadata.isReadOnly() || !metadata.isStandardMetadataFormatSupported()) {
                            return;
                        }
                        JPEGMetadata jpegMetadata = (JPEGMetadata) metadata;
                        try {
                            IIOMetadataNode horiz = new IIOMetadataNode("HorizontalPixelSize");
                            horiz.setAttribute("value", Double.toString(getDpi()));
                            IIOMetadataNode vert = new IIOMetadataNode("VerticalPixelSize");
                            vert.setAttribute("value", Double.toString(getDpi()));
                            IIOMetadataNode dim = new IIOMetadataNode("Dimension");
                            dim.appendChild(horiz);
                            dim.appendChild(vert);
                            jpegMetadata.mergeTree("Dimension", dim);

                            BufferedImage removeAlphaChannelAndScaleUpImage = removeAlphaChannel(scaleUpImage);
                            writer.write(jpegMetadata, new IIOImage(removeAlphaChannelAndScaleUpImage, null, jpegMetadata), writeParam);
                            Desktop desktop = Desktop.getDesktop();
                            try {
                                desktop.open(file);
                            } catch (Exception e) {
                                App.logger.fatal("Ops! look at this fatal error in opening the file explorer: " + e.getMessage());
                            }
                            return;
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                    }

                } finally {
                    loadingBarForMes.setVisible(false);
                }
            }).start();
13
  • Why do you need to use classes in a psckage that should not be used by applications? Commented Oct 30, 2023 at 0:14
  • I use Java.desktop and I need it because of create metadata for image that created by ImageIO . Commented Oct 30, 2023 at 0:18
  • 2
    Yes. You do. You shouldn't >>need<< to use an internal class. Perhaps you should show us the relevant code so that we can figure out why you are using that class, and suggest alternatives? Commented Oct 30, 2023 at 0:36
  • 2
    Why are you casting the IIOMetadata to a JPEGMetadata? Given what you do with it, it seems unnecessary. Or am I missing something? Commented Oct 30, 2023 at 0:44
  • 1
    You don’t need to use the JPEGMetadata class in your code. metadata.mergeTree is exactly the same as jpegMetadata.mergeTree. Commented Oct 30, 2023 at 19:01

0

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.