2016-05-04 5 views
1

Мне просто нужно руководство, и я не могу найти другой вопрос, который отвечает за это. Я думаю, что ответ даже не должен быть JavaFx-specific.Самый эффективный способ загрузки и обработки больших изображений в JavaFX

Я бы хотел загрузить и обработать довольно большие изображения/пиксельные массивы в приложении JavaFX.

Прямо сейчас у меня есть простой подход: простая Stackpane, которая содержит объект Canvas, загружаемый в ScrollPane.

ScrollPane scrollPane = new ScrollPane(); 
StackPane stackPane = new StackPane(); 
Canvas = new Canvas(4000,6000); 

stackPane.getChildren().add(canvas); 
scrollPane.setContent(stackPane); 
root.setCenter(scrollPane); 

на определенном Canvassize не удается создать объект Canvas и я получаю несколько исключений. Что, если бы у меня были большие размеры в моем сознании?

Является ли общий размер холста влияющим на производительность или просто просмотр деталей в области прокрутки?

+0

С вашего вопроса непонятно, почему вы используете «Холст» во время разговора об изображениях. На мой взгляд, в JavaFX это означает «Image» и «ImageView». Просьба уточнить. – hotzst

+0

Кто-то сказал мне, что холст обладает лучшей производительностью при работе с пиксельными массивами – user6272596

ответ

3

В некоторых Canvassize невозможно создать объект Canvas, и я получаю несколько исключений.

По умолчанию узлы JavaFX визуализируются графическим оборудованием как текстуры. Различное графическое оборудование имеет разные пределы в максимальном размере, который может иметь одна текстура. Обычно этот размер размера текстуры составляет порядка 2, а общие максимумы для различного графического оборудования могут быть 8192x8192 или 16384x16384. По соображениям совместимости, вероятно, лучше всего предположить максимальный размер текстуры 8192x8192 или даже 4096x4096, если вы хотите быть очень консервативным.

Что делать, если у меня были большие размеры в голове?

Использование нескольких узлов в алгоритме черепицы. Например, создайте холст 32768x32768 с использованием массива 8x8, состоящего из 64 4096x4096 отдельных холстов. Вам нужно будет написать логику для обработки этого самостоятельно, нет существующей библиотеки, которая будет делать это для вас, насколько я знаю. Для чрезвычайно больших размеров, например. сотни тысяч или миллионы пикселей в поперечнике, то может оказаться полезным виртуализованный элемент управления, такой как GridView.

Кто-то сказал мне холст имеет более высокую производительность при работе с пиксельными массивами

Я сомневаюсь, что холст будет иметь лучшие характеристики, чем в WritableImage подкрепленную PixelWriter и PixelReader как холст необходимо для обслуживания более широкий и более сложный набор функций и функций. Тем не менее, для большинства приложений пользователи вряд ли заметят существенную разницу между производительностью холста и WritableImage, и вам, вероятно, следует выбирать между ними на основе наилучшего функционального соответствия вашему приложению.

В качестве одного из рекомендаций, при работе с изображениями на уровне пикселей, необходимо выбрать подходящий PixelFormat, который изначально используется вашим графическим оборудованием, поскольку это уменьшает объем копирования и преобразования данных пикселей, необходима базовая система рендеринга. Для получения дополнительной информации о понимании этого совета производительности обратитесь к соответствующему дискуссионному форуму Oracle JavaFX: Canvas performance.

+0

Ничего себе, очень хорошая информация здесь (пока это правильно). – XaolingBao

1

Использование холста здесь, вероятно, не такая хорошая идея, потому что холст не обеспечивает PixelReader. Единственный способ, которым вы можете получить пиксели, - сделать снимок.С изображением у вас есть как PixelReader, так и PixelWriter. Я сомневаюсь, что любая серьезная программа манипулирования изображениями будет работать, не имея возможности манипулировать отдельными пикселями в обоих направлениях.