Как рассчитать координаты каждой вершины найденного изображения в формате PDF - PullRequest
0 голосов
/ 17 апреля 2019

Я хочу вычислить координаты вершин для извлеченных изображений

Я извлек изображения с помощью PDFBOX. После этого я начал изучать матрицу

Matrix ctmNew = getGraphicsState().getCurrentTransformationMatrix();

Я много раз пытался определить координаты каждого угла, но не мог придумать универсальное решение для (нормальное изображение, отражение, поворот и т. Д.)

public class StreamEngine extends PDFStreamEngine {

    private ImageFile buildImage(final PDXObject element) throws IOException {
        final PDRectangle cropBox = getCurrentPage().getCropBox();
        final PDRectangle mediaBox = getCurrentPage().getMediaBox();
        final PDImageXObject image = (PDImageXObject) element;
        Matrix ctmNew = getGraphicsState().getCurrentTransformationMatrix();
        final double imageWidth = ctmNew.getScalingFactorX();
        final double imageHeight = ctmNew.getScalingFactorY();
        final double bottom = mediaBox.getHeight() - ctmNew.getTranslateY(); //I need coordinates started from top
        final double left = ctmNew.getTranslateX();
        final ImageFile imageFile = new ImageFile();
        imageFile.setImageFormat("png");
        imageFile.setImageHeight(imageHeight);
        imageFile.setImageWidth(imageWidth);
        imageFile.setLeft(left);
        imageFile.setPageWidth(cropBox.getWidth());
        imageFile.setPageHeight(cropBox.getHeight());
        imageFile.setBottom(bottom);
// do proper calculation here
        return imageFile;
    }
}

В настоящее время я не получаю правильные координаты для перевернутого + повернутого изображения. И каждый раз, когда я корректирую код для конкретного случая, предыдущий случай портится.

Пожалуйста, не исправляйте приведенный выше код, просто дайте мне несколько советов, как мне вычислить координаты.

scheme of the data required

1 Ответ

0 голосов
/ 17 апреля 2019

Ответ был довольно простым Ссылка: https://code -industry.net / masterpdfeditor-help / преобразование-матрица /

    private void calculateCoordinates(final ImageFile imageFile, final Matrix ctmNew) {

        double llx = calculateXCoordinate(ctmNew, 0, 0);
        double lly = calculateYCoordinate(ctmNew, 0, 0);

        double ulx = calculateXCoordinate(ctmNew, 0, 1);
        double uly = calculateYCoordinate(ctmNew, 0, 1);

        double lrx = calculateXCoordinate(ctmNew, 1, 0);
        double lry = calculateYCoordinate(ctmNew, 1, 0);

        double urx = calculateXCoordinate(ctmNew, 1, 1);
        double ury = calculateYCoordinate(ctmNew, 1, 1);

        final double left = Math.min(Math.min(llx, ulx), Math.min(lrx, urx));
        final double top = Math.max(Math.max(lly, uly), Math.max(lry, ury));

        final double right = Math.max(Math.max(llx, ulx), Math.max(lrx, urx));
        final double bottom = Math.min(Math.min(lly, uly), Math.min(lry, ury));

        imageFile.setTop(top);
        imageFile.setBottom(bottom);
        imageFile.setLeft(left);
        imageFile.setRight(right);
    }

    private double calculateXCoordinate(final Matrix ctmNew, final double x, final double y) {
        double a = ctmNew.getValue(0, 0);
        double c = ctmNew.getValue(1, 0);
        double e = ctmNew.getValue(2, 0);
        return a * x + c * y + e;
    }

    private double calculateYCoordinate(final Matrix ctmNew, final double x, final double y) {
        double b = ctmNew.getValue(0, 1);
        double d = ctmNew.getValue(1, 1);
        double f = ctmNew.getValue(2, 1);
        return b * x + d * y + f;
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...