2016-04-25 1 views
6

Я разрабатываю приложение, которое требует много сравнения данных изображения в JavaFX. Для этого сравнения мне нужно получить данные rgb пикселей в изображениях. Предположим, что картина, которую мне нужно сравнить, - это Picture1 и Picture2. Picture1 - это входное изображение, выбранное пользователем. Picture2 - это рисунок, который я делаю программно.Альтернатива (ов) преобразования Canvas в WritableImage

AFAIK, единственный способ получить данные rgb на пиксель в JavaFX - с PixelReader из Image. Это нормально для Picture1, так как это вход. Но мне нужно сделать рисунок на Picture2 и Picture2 является Canvas (Обращают многоугольники на Picture2 и потому, что рисунок попиксельны с PixelWriter немного сложнее IMO) и не имеет PixelReader или что-то с аналогичной функциональностью , Так что мое решение выглядит следующим образом:

  1. Читать входное изображение и сделать picture1
  2. Сделать холст и сделать рисунок
  3. Закрепить Холст к Scene
  4. Make моментальный снимок сцены и сделать WritableImage (Picture2)
  5. Сравнить Picture1 и Picture2

Так у меня есть метод с чем-то вроде:

public static WritableImage makeDrawableImage(Canvas in) { 
    AnchorPane root = new AnchorPane(in); 
    WritableImage out = new WritableImage((int)in.getWidth(), (int)in.getHeight()); 
    Scene sc = new Scene(root, in.getWidth(), in.getHeight()); 

    out = in.snapshot(null, null); 

    return out; 
} 

Однако для моментального снимка требуется очень много времени. Значение out никогда не присваивается. Я не знаю, что я сделал неправильно.

Есть альтернативы для перевода: Canvas на Image или WritableImage? Или, может быть, есть библиотека, чтобы сделать рисование полигонов проще с помощью PixelWriter?

Пожалуйста, будьте мягкими на меня. Это мой первый вопрос о переполнении стека, и я не являюсь программистом реального или студентом ИТ. Я кодирую как хобби.

Итак, заранее. Приветствия.

ответ

1

Вы можете создать снимок холста с этим методом:

public static WritableImage pixelScaleAwareCanvasSnapshot(Canvas canvas, double pixelScale) { 
    WritableImage writableImage = new WritableImage((int)Math.rint(pixelScale*canvas.getWidth()), (int)Math.rint(pixelScale*canvas.getHeight())); 
    SnapshotParameters spa = new SnapshotParameters(); 
    spa.setTransform(Transform.scale(pixelScale, pixelScale)); 
    return canvas.snapshot(spa, writableImage);  
} 

Шкала пикселей обычно является 1,0, если у вас есть экран HiDPI.

+0

Это все еще не работает :(Моя проблема связана с 'out = in.snapshot (null, null);' Это занимает очень много времени. Неужели так долго делать снимок? –

+0

Что такое doen ' t Работа для вас? Насколько велики ваши изображения? – mipa

+0

Очевидно, что вы все еще используете свой код, а не мой. В моем коде нет строки 'out = in.snapshot (null, null);' Съемка холста 2000x2000 просто занимает миллисекунды. – mipa