Лучший способ справиться с буферизацией awt.Image в JavaFX

У меня есть класс, который принимает параметр String и выполняет поиск Google, затем он получает десять изображений и помещает их в массив, который затем обрабатывается другим методом в том же классе. Использование Javafx.scene.image, вероятно, позволило бы мне легко реализовать процесс буферизации, но есть ошибка с JavaFX Image, которая неверно интерпретирует цветовую кодировку обычных изображений и сохраняет странное изображение на жесткий диск, поэтому я просто решил использовать awt.Image.

Это класс поиска изображений:

public class GoogleCustomSearch {

    static String key = //custom google id;
    static String cx = // also a custom google id;
    static String searchType = "image";
    static java.awt.Image[] publicImageArray;


    public static java.awt.Image[] Search(String searchParameter,int start) throws IOException, URISyntaxException{

        String formatedText = URLEncoder.encode(searchParameter,"UTF-8");

        URL url = new URL("https://www.googleapis.com/customsearch/v1?" + "key=" +key + "&cx=" +cx + "&q=" +formatedText + "&searchType=" +searchType +"&imgSize=medium" + "&start=" + start + "&num=10");
        System.out.println(url);
        HttpURLConnection conn = (HttpURLConnection) url.openConnection();
        conn.setRequestMethod("GET");
        conn.setRequestProperty("Accept", "application/json");
        BufferedReader br = new BufferedReader(new InputStreamReader( ( conn.getInputStream() ) ) );
        GResults results = new Gson().fromJson(br, GResults.class);

        java.awt.Image [] imageArray = new java.awt.Image[10];
        //JProgressBar prb = new JProgressBar();
        //MediaTracker loadTracker = new MediaTracker(prb);
        for(int i = 0; i<10; i++){
            try {
                imageArray[i] = ImageIO.read(new URL(results.getLink(i)));
            }catch (java.io.IOException e){
                imageArray[i] = ImageIO.read(new File("C:\\Users\\FILIP.D\\IdeaProjects\\Manual_Artwork\\src\\MAT - NoImage.jpg"));
            }

        }
        conn.disconnect();

        return imageArray;

    }

    public static BufferedImage getImage(String searchPar, int index, boolean newSearch) throws IOException, URISyntaxException {
        int adaptedIndex;
        int start;
        BufferedImage bimage;
        if(index<10){
            adaptedIndex = index;
            start = 1;
        }else if (index<20){
            start = 11;
            adaptedIndex = index % 10;
            if(index == 10){
                publicImageArray = new java.awt.Image[10];
                publicImageArray = Search(searchPar,start);
            }
        }else if(index < 30){
            start = 21;
            adaptedIndex = index % 10;
            if (index == 20) {
                publicImageArray = new java.awt.Image[10];
                publicImageArray = Search(searchPar,start);
            }
        }else{
            adaptedIndex = index % 10;
            start = 21; //ovo ce posle 30 da ga vrti u loop prvih 10
        }
        if(newSearch){
            publicImageArray = new java.awt.Image[10];
            publicImageArray = Search(searchPar,start);
            return bimage = (BufferedImage) publicImageArray[adaptedIndex];
        }else{
            return bimage = (BufferedImage) publicImageArray[adaptedIndex];
        }
    }

    public static RenderedImage getLiveImage (int index){
        return (RenderedImage) publicImageArray[index % 10];
    }
}

И это фрагмент основного класса графического интерфейса, который просто обрабатывает открытие нового изображения в массиве

private void nextImageResult() throws IOException, URISyntaxException {
        if(imgNr == -1){
            imgNr++;
            changeImage(SwingFXUtils.toFXImage(GoogleCustomSearch.getImage(oppenedTrack.getArtistName() + "+" + oppenedTrack.getTrackName(),imgNr,true),null));
        }else{
            imgNr++;
            changeImage(SwingFXUtils.toFXImage(GoogleCustomSearch.getImage(oppenedTrack.getArtistName() + "+" + oppenedTrack.getTrackName(),imgNr,false),null));
        }

    }

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

0 ответов

Другие вопросы по тегам