JavaFX / FXML изменяет размер изображения с постоянным соотношением пикселей [дубликат]

Технически нет прямого способа сделать это, однако вы можете сортировать это с помощью jquery или javascript.

Howeve, вы также можете сделать что-то подобное.

a.active h1 {color:blue;}
a.active p {color: green;}

jQuery

$("a.active").parents('li').css("property", "value"); 

Если вы хотите достичь этого с помощью jQuery, здесь приведена ссылка для родительского селектора jQuery

13
задан fabian 3 November 2016 в 10:03
поделиться

3 ответа

В JavaFX 2.2 ImageView всегда будет выполняться сглаживание независимо от плавного намека, который вы предоставляете ImageView.

(На основе тестирования с использованием Java 7u15 и Windows 7 с видеокартой ATI HD4600).

Возможно, это ошибка, которая ImageView всегда будет сглаживать Image, но в документации не указано точно, что сглаживание делает или не делает, поэтому трудно сказать, каково его реальное намерение. Вы можете отправить ссылку на этот вопрос в список рассылки openjfx-dev или зарегистрировать проблему в трее JavaFX issue tracker , чтобы получить более экспертное мнение от разработчика.


Я попробовал несколько разных методов масштабирования изображения:

  1. Масштаб в конструкторе изображения .
  2. Масштабирование в ImageView с помощью fitWidth / fitHeight .
  3. Масштаб с использованием шкалы scaleX / Y на ImageView.
  4. Масштабирование путем выборки Image с помощью PixelReader и создания нового изображения с помощью PixelWriter .

Я обнаружил, что методы 1 & amp; 4 привело к резкому пиксели изображения, как вы хотите, и 2 & amp; 3 приводило к размытому изображению с псевдонимом.

robot-sampling [/g15]

Пример кода для генерации указанного выше выхода.


Обновление с идеями по внедрению собственного фильтра изображений

Эффект JavaFX не совпадает с фильтром, используемым для подпрограмм загрузки изображений, хотя Эффект для фильтрации изображение может быть создано. В JavaFX 2.2 публично документированный API для поддержки создания пользовательских эффектов, поэтому создание настраиваемого эффекта может оказаться затруднительным.

Собственный код для поддержки изображений был недавно открыт в качестве части проект openjfx , поэтому вы можете посмотреть на это, чтобы увидеть, как в настоящее время выполняется фильтрация.

Вы также можете запросить запрос функции в отношении проекта среды исполнения JavaFX , чтобы «позволить нам создавать собственные 2D-фильтры».

20
ответ дан jewelsea 20 August 2018 в 08:57
поделиться
  • 1
    Вы всегда дарите такие впечатляющие ответы jewelsea: D – Andy Till 18 April 2013 в 21:58
  • 2
    Да, спасибо за подробный ответ. Я пришел к такому же выводу и закончил реализацию №4. Сама реализация тривиальна, но я боюсь, что она намного медленнее, чем # 2 или # 3 (хотя я еще не подтвердил это). – ajselvig 19 April 2013 в 18:53
  • 3
    Прошло два года с момента ответа. Кто-нибудь знает, исправлено ли это в JavaFX? – Edu Garcia 8 September 2015 в 05:30
  • 4
    Я не уверен, что вы подразумеваете под фиксированным Эду. Я предполагаю, что система ведет себя так, как планируют разработчики. Если вы хотите получить дополнительную информацию о фильтрации и сглаживании изображений в JavaFX, вы можете опубликовать список рассылки разработчиков open-jfx, как указано в ответе. – jewelsea 8 September 2015 в 17:04
  • 5
    Странно, решение N ° 1 просто не работает в моем файле BMP, оно не загружает изображение, оно хорошо работает для 3 других решений, я буду использовать решение № 4. Спасибо. – pdem 19 July 2016 в 15:25

Когда вы добавляете следующий конструктор в ответ Мартина Сойки, вы можете просто передать javafx Image в конструктор. Кроме того, несмотря на предупреждения об устаревших функциях, его ответ все еще работает нормально (на JDK 1.8_121).

public PixelatedImageView (javafx.scene.image.Image image) {
    super(image);
}
0
ответ дан Lappro 20 August 2018 в 08:57
поделиться

Я знаю, что это немного старше, но мне недавно понадобился такой ImageView, и следующий небольшой взлом делает именно то, что я хочу на моей (Windows) машине. Нет гарантий, что он работает повсюду.

import com.sun.javafx.sg.prism.NGImageView;
import com.sun.javafx.sg.prism.NGNode;
import com.sun.prism.Graphics;
import com.sun.prism.Texture;
import com.sun.prism.impl.BaseResourceFactory;

import com.sun.prism.Image;
import javafx.scene.image.ImageView;

@SuppressWarnings("restriction")
public class PixelatedImageView extends ImageView {
    @Override protected NGNode impl_createPeer() {
        return new NGImageView() {
            private Image image;

            @Override public void setImage(Object img) {
                super.setImage(img);
                image = (Image) img;
            }

            @Override protected void renderContent(Graphics g) {
                BaseResourceFactory factory = (BaseResourceFactory) g.getResourceFactory();
                Texture tex = factory.getCachedTexture(image, Texture.WrapMode.CLAMP_TO_EDGE);
                tex.setLinearFiltering(false);
                tex.unlock();
                super.renderContent(g);
            }
        };
    }
}

Фокус в том, что текстура снова используется, поэтому линейная фильтрация остается «липкой». Почему NGImageView не мог просто передать флаг «гладкий», чтобы линейная фильтрация текстуры была вне меня.

3
ответ дан Martin Sojka 20 August 2018 в 08:57
поделиться
  • 1
    Похоже, они не хотят, чтобы вы это делали. – Nolan 5 June 2017 в 19:19
  • 2
    Это работало на Java 8, но похоже, что упомянутые здесь функции были переименованы и установлены на частные функции в Java 9. Не похоже, что он может быть переопределен таким же образом без значительных изменений в ImageView и ImageViewHelper. Кто-нибудь понял, как работать с новыми ограничениями в Java 9? – ddukki 1 November 2017 в 00:47
Другие вопросы по тегам:

Похожие вопросы: