Загрузка изображения из кеша с помощью BitmapFactory.decodeStream() в Android

ОБНОВЛЕНИЯ: даже если я не получаю изображения из кеша, я пытался получить их через Drawable, где я сохранил все 18 изображений в папке «drawable-mdpi». Тем не менее, пустой экран отображался.

Мне удалось получить изображения с сервера и сохранить изображение (.GIF) в кэше. Однако, когда мне нужно загрузить это изображение из кеша, изображение не отображается на экране. Вот коды, которые работают:

    File cacheDir = context.getCacheDir();

            File cacheMap = new File(cacheDir, smallMapImageNames.get(i).toString());
            if(cacheMap.exists()){
                FileInputStream fis = null;
                try {
                    fis = new FileInputStream(cacheMap);
                    Bitmap local = BitmapFactory.decodeStream(fis);
                    puzzle.add(local);  
                } catch (FileNotFoundException e) {
                    e.printStackTrace();
                }

            }else{
                Drawable smallMap = LoadImageFromWebOperations(mapPiecesURL.get(i).toString());
                if(i==0){
                    height1 = smallMap.getIntrinsicHeight();
                    width1 = smallMap.getIntrinsicWidth();
                }
                if (smallMap instanceof BitmapDrawable) { 
                    Bitmap bitmap = ((BitmapDrawable)smallMap).getBitmap();
                    FileOutputStream fos = null;
                    try {
                        cacheMap.createNewFile();
                        fos = new FileOutputStream(cacheMap);
                        bitmap.compress(Bitmap.CompressFormat.PNG, 100, fos);
                        fos.flush();       
                        fos.close(); 
                    } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }       

                    puzzle.add(bitmap);
                }
            }

ArrayList для хранения имен изображений: smallMapImageNames (имена изображений также можно найти в URL-адресе)

ArrayList для хранения URL изображений: mapPiecesURL

Подводя итог, у меня есть 2 вопроса: 1) как загрузить изображения из кеша? 2) что касается bitmap.compress(), изображения с сервера имеют формат .GIF, но я применяю Bitmap.CompressFormat.PNG. Так не будет ли с этим проблем?

Кто-нибудь может помочь мне с этим?

Две функции

    private Bitmap getBitMap(Context context) {
        // TODO Auto-generated method stub
        WifiPositioningServices wifiPositioningServices = new WifiPositioningServices();

        String[] mapURLandCalibratedPoint1 = wifiPositioningServices.GetMapURLandCalibratedPoint("ERLab-1_1.GIF","ERLab"); //list of map pieces url in the first 9 pieces
        String[] mapURLandCalibratedPoint2 = wifiPositioningServices.GetMapURLandCalibratedPoint("ERLab-4_1.GIF","ERLab"); //list of map pieces url in the last 9 pieces
        ArrayList<String> smallMapImageNames = new ArrayList<String>();
        ArrayList<String> mapPiecesURL = new ArrayList<String>();

        for(int i=0; i<mapURLandCalibratedPoint1.length; i++){
                if(mapURLandCalibratedPoint1[i].length()>40){ //image url
                    int len = mapURLandCalibratedPoint1[i].length();
                    int subStrLen = len-13;
                    smallMapImageNames.add(mapURLandCalibratedPoint1[i].substring(subStrLen, len-3)+"JPEG");
                    mapPiecesURL.add(mapURLandCalibratedPoint1[i]);
                }
                else{
                    //perform other task
                }

        }

        for(int i=0; i<mapURLandCalibratedPoint2.length; i++){
            if(mapURLandCalibratedPoint2[i].length()>40){ //image url
                int len = mapURLandCalibratedPoint2[i].length();
                int subStrLen = len-13;
                smallMapImageNames.add(mapURLandCalibratedPoint2[i].substring(subStrLen, len-3)+"JPEG");
                mapPiecesURL.add(mapURLandCalibratedPoint2[i]);
            }
            else{
                //perform other task
            }       
        }
        Bitmap result = Bitmap.createBitmap(1029, 617, Bitmap.Config.ARGB_8888);
        Canvas canvas = new Canvas(result);
        ArrayList<Bitmap> puzzle = new ArrayList<Bitmap>();

        int height1 = 0 ;
        int width1 = 0;

        File cacheDir = context.getCacheDir();

        for(int i=0; i<18; i++){                
            File cacheMap = new File(cacheDir, smallMapImageNames.get(i).toString());
            if(cacheMap.exists()){
                //retrieved from cached
                try {           
                    FileInputStream fis = new FileInputStream(cacheMap);                
                    Bitmap bitmap = BitmapFactory.decodeStream(fis);
                    puzzle.add(bitmap);
                } catch (FileNotFoundException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }

            }else{
                //retrieve from server and cached it
                Drawable smallMap = LoadImageFromWebOperations(mapPiecesURL.get(i).toString());
                if(i==0){
                    height1 = smallMap.getIntrinsicHeight();
                    width1 = smallMap.getIntrinsicWidth();
                }
                if (smallMap instanceof BitmapDrawable) { 
                    Bitmap bitmap = ((BitmapDrawable)smallMap).getBitmap();
                    FileOutputStream fos = null;
                    try {
                        cacheMap.createNewFile();
                        fos = new FileOutputStream(cacheMap);
                        bitmap.compress(CompressFormat.JPEG, 100, fos);
                        fos.flush();       
                        fos.close(); 
                    } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }       

                    puzzle.add(bitmap);
                }
            }       
        }

        Rect srcRect;
        Rect dstRect;
        int cnt =0;


        for (int j = 0; j < 3; j++) {
            int newHeight = height1 * (j % 3);
            for (int k = 0; k < 3; k++) {
                if (j == 0 && k == 0) {
                    srcRect = new Rect(0, 0, width1, height1);
                    dstRect = new Rect(srcRect);
                } else {
                    int newWidth = width1 * k;
                    srcRect = new Rect(0, 0, width1, height1);
                    dstRect = new Rect(srcRect);
                    dstRect.offset(newWidth, newHeight);
                }
                canvas.drawBitmap(puzzle.get(cnt), srcRect, dstRect,null);
                cnt++;
            }
        }

        for(int a=0; a<3; a++){
            int newHeight = height1 * (a % 3);
            for (int k = 3; k < 6; k++) {
                if (a == 0 && k == 0) {
                    srcRect = new Rect(0, 0, width1*3, height1);
                    dstRect = new Rect(srcRect);
                } else {
                    int newWidth = width1 * k;
                    srcRect = new Rect(0, 0, width1, height1);
                    dstRect = new Rect(srcRect);
                    dstRect.offset(newWidth, newHeight);
                }
                canvas.drawBitmap(puzzle.get(cnt), srcRect, dstRect,
                        null);
                cnt++;
            }
        }
        return result;
    }

    private Drawable LoadImageFromWebOperations(String url) {
        // TODO Auto-generated method stub
        try
        {
            InputStream is = (InputStream) new URL(url).getContent();
            Drawable d = Drawable.createFromStream(is, "src name");
            return d;
        }catch (Exception e) {
            System.out.println("Exc="+e);
            return null;
        }
    }

На самом деле я пытаюсь отобразить 18 частей (3X6) изображений, чтобы сформировать план этажа. Итак, чтобы отобразить изображения, я использую два цикла for для их отображения. два изображения .GIF, ERLab-1_1.GIF и ERLab-4_1.GIF, являются центральной частью каждой группы. Например, первой строкой будет ERLab-0_0.GIF, ERLab-1_0.GIF, ERLab-2_0.GIF, ERLab-3_0.GIF, ERLab-4_0.GIF, ERLab-5_0.GIF. Вторая строка будет XXX-X_1.GIF, а XXX-X_2.GIF для третьей строки.

Наконец,

Bitmap resultMap = getBitMap(this.getContext());
bmLargeImage = Bitmap.createBitmap(1029 , 617, Bitmap.Config.ARGB_8888);
bmLargeImage = resultMap;

Тогда в функции onDraw будет рисование изображения на холсте.


person user918197    schedule 25.09.2011    source источник
comment
извините, что я забыл упомянуть об этом. Это просто еще один ArrayList для хранения всех растровых изображений после их извлечения из кеша (если изображения уже доступны в кеше) или с сервера.   -  person user918197    schedule 25.09.2011
comment
decodeStream успешно возвращает растровое изображение?   -  person Ronnie    schedule 25.09.2011
comment
я так не думаю, потому что я добавил следующие строки, чтобы проверить, является ли растровое изображение нулевым. if (растровое изображение != null) Puzzle.add(растровое изображение); else{ Log.e(onCreate: , bMap es NULL); } Ничего не появляется, значит изображения извлекаются, но где-то еще что-то не так?   -  person user918197    schedule 25.09.2011
comment
теперь я получаю нулевое значение для decodeStream.   -  person user918197    schedule 26.09.2011


Ответы (1)


Я только что решил свой вопрос.

В этой строке canvas.drawBitmap(puzzle.get(cnt), srcRect, dstRect,null); в каждом цикле for, который я использую для рисования растрового изображения на холсте, мне нужно привести каждый элемент в ArrayList (головоломка) к растровому изображению. Только тогда изображение будет отображаться.

Я думал, что если ArrayList определен как таковой, ArrayList<Bitmap> puzzle = new ArrayList<Bitmap>(); каждый элемент в ArrayList будет иметь тип Bitmap. Но не всегда ли это так?

person user918197    schedule 27.09.2011