在JavaFX中处理awt.Image缓冲的最佳方法

时间:2016-03-11 18:38:37

标签: image javafx buffered

我有一个类,它接受一个String参数并执行谷歌搜索,然后它获取十个图像并将它们放在一个数组中,然后由同一个类中的另一个方法处理。使用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];
    }
}

这是主GUI类的片段,它只处理在数组中打开新图像

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));
        }

    }

总而言之,我需要一种正确的方法在加载之前在图像的位置显示进度条,并且它不需要挂起UI,我可以使用任务。我可以使用MediaTracker优化数组的加载,因此它可以优先加载前几个图像。

0 个答案:

没有答案