图像没有下载?

时间:2014-05-26 04:53:33

标签: android bitmap

我通过管理位图来学习下载图像。我使用BitmapFactory:options.inJustDecodeBounds下载图像。当我使用此声明时, Bitmap bitmap = BitmapFactory.decodeStream(in) - 确实有效。 但是,当我使用样本大小并试图计算时,它不下载。我用过这样的东西:

public Bitmap downloadUrlToStream(String urlString, final ImageView imageView) {
        HttpURLConnection urlConnection = null;
        BufferedInputStream in = null;

        try {
            final URL url = new URL(urlString);
            urlConnection = (HttpURLConnection) url.openConnection();
            in = new BufferedInputStream(urlConnection.getInputStream(), IO_BUFFER_SIZE);

            return decodeSampledBitmapFromResource(200,200,in);

        } catch (final IOException e) {
            Log.e(TAG, "Error in downloadBitmap - " + e);
        } finally {
            if (urlConnection != null) {
                urlConnection.disconnect();
            }
            try {
                if (in != null) {
                    in.close();
                }
            } catch (final IOException e) {
            }
        }
        return null;    }

public static Bitmap decodeSampledBitmapFromResource(int reqWidth, int reqHeight, InputStream is) {

    final BitmapFactory.Options options = new BitmapFactory.Options();
    options.inJustDecodeBounds = true;
    BitmapFactory.decodeStream(is, null, options);
    // Calculate inSampleSize
    options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight);

    options.inJustDecodeBounds = false;
    return BitmapFactory.decodeStream(is, null, options);
}

public static int calculateInSampleSize(BitmapFactory.Options options, int reqWidth, int reqHeight) {
        // BEGIN_INCLUDE (calculate_sample_size)
        // Raw height and width of image
        final int height = options.outHeight;
        final int width = options.outWidth;
        int inSampleSize = 1;

        if (height > reqHeight || width > reqWidth) {

            final int halfHeight = height / 2;
            final int halfWidth = width / 2;

            // Calculate the largest inSampleSize value that is a power of 2 and
            // keeps both
            // height and width larger than the requested height and width.
            while ((halfHeight / inSampleSize) > reqHeight && (halfWidth / inSampleSize) > reqWidth) {
                inSampleSize *= 2;
            }

            // This offers some additional logic in case the image has a strange
            // aspect ratio. For example, a panorama may have a much larger
            // width than height. In these cases the total pixels might still
            // end up being too large to fit comfortably in memory, so we should
            // be more aggressive with sample down the image (=larger
            // inSampleSize).

            long totalPixels = width * height / inSampleSize;

            // Anything more than 2x the requested pixels we'll sample down
            // further
            final long totalReqPixelsCap = reqWidth * reqHeight * 2;

            while (totalPixels > totalReqPixelsCap) {
                inSampleSize *= 2;
                totalPixels /= 2;
            }
        }
        return inSampleSize;
        // END_INCLUDE (calculate_sample_size)
}

calculateSamplesize()方法是否存在问题。是不行啊?

5 个答案:

答案 0 :(得分:0)

我建议你使用另一种方式,就像魅力:Android查询。

您可以从此处下载该jar文件:http://code.google.com/p/android-query/downloads/list

AQuery androidAQuery=new AQuery(this);

举个例子:

androidAQuery.id(YOUR IMAGEVIEW).image(YOUR IMAGE TO LOAD, true, true, getDeviceWidth(), ANY DEFAULT IMAGE YOU WANT TO SHOW);

使用上面的代码,您可以直接通过网址显示您的图片。现在下面的代码是从url:

直接获取Bitmap
   androidAQuery.ajax(YOUR IMAGE URL,Bitmap.class,0,new AjaxCallback<Bitmap>(){
                            @Override
                            public void callback(String url, Bitmap object, AjaxStatus status) {
                                super.callback(url, object, status);

                                //You will get Bitmap from object.
                            }


  });

此库由Android本身提供,因此请使用它并查看您想要的结果。

它非常快速和准确,使用它你可以在加载时找到更多的功能,如动画,如果需要,可以获得位图等。

答案 1 :(得分:0)

您可以使用Universal imageLoader下载和调整位图大小,这是示例代码,

protected ImageLoader imageLoader = ImageLoader.getInstance();
    DisplayImageOptions options;



    options = new DisplayImageOptions.Builder().resetViewBeforeLoading()
                .cacheOnDisc().imageScaleType(ImageScaleType.IN_SAMPLE_INT)
                .bitmapConfig(Bitmap.Config.RGB_565)
                .displayer(new FadeInBitmapDisplayer(100)).build();
        imageLoader.init(ImageLoaderConfiguration.createDefault(getActivity()));


    imageLoader.displayImage(
                    <Image_URL>,
                    <Image_view>, options, new ImageLoadingListener() {
                        @Override
                        public void onLoadingComplete(String imageUri,
                                View view, Bitmap loadedImage) {
                            <Image_view>.setImageBitmap(resizedBitmap(loadedImage,200,200));
                        }

                        @Override
                        public void onLoadingStarted(String imageUri, View view) {
                            // TODO Auto-generated method stub

                        }

                        @Override
                        public void onLoadingFailed(String imageUri, View view,
                                FailReason failReason) {
                            // TODO Auto-generated method stub

                        }

                        @Override
                        public void onLoadingCancelled(String imageUri,
                                View view) {
                            // TODO Auto-generated method stub

                        }
                    });

                    // Image resize 

                    public Bitmap resizedBitmap(Bitmap bm, int newHeight, int newWidth) {

int width = bm.getWidth();

int height = bm.getHeight();

float scaleWidth = ((float) newWidth) / width;

float scaleHeight = ((float) newHeight) / height;

// CREATE A MATRIX FOR THE MANIPULATION

Matrix matrix = new Matrix();

// RESIZE THE BIT MAP

matrix.postScale(scaleWidth, scaleHeight);

// RECREATE THE NEW BITMAP

Bitmap resizedBitmap = Bitmap.createBitmap(bm, 0, 0, width, height, matrix, false);

return resizedBitmap;

}

注意: 别忘了添加通用图像加载程序库。

答案 2 :(得分:0)

没有理由不工作。确保calculateInSampleSize正常运行。

options.inSampleSize需要高于1.确保您在此处获得有效值。

答案 3 :(得分:0)

尝试以下代码:

public void DownloadImageFromPath(String path){
            InputStream in =null;
            Bitmap bmp=null;
             ImageView iv = (ImageView)findViewById(R.id.img1);
             int responseCode = -1;
            try{

                 URL url = new URL(path);//"http://192.xx.xx.xx/mypath/img1.jpg
                 HttpURLConnection con = (HttpURLConnection)url.openConnection();
                 con.setDoInput(true);
                 con.connect();
                 responseCode = con.getResponseCode();
                 if(responseCode == HttpURLConnection.HTTP_OK)
                 {
                     //download 
                     in = con.getInputStream();
                     bmp = BitmapFactory.decodeStream(in);
                     in.close();
                     iv.setImageBitmap(bmp);
                 }

            }
            catch(Exception ex){
                Log.e("Exception",ex.toString());
            }
        }

答案 4 :(得分:0)

只需在位图中获取下载的文件,然后在imageView中设置位图

URL url = new URL(urlString);
Bitmap bmp = BitmapFactory.decodeStream(url.openConnection().getInputStream());
imageView.setImageBitmap(bmp);

希望有所帮助