我想将URL转换为Bitmap image.i我也尝试在SD卡上压缩并保存这个位图,但是当我运行代码时,Web Image-view中没有显示任何图像。我有以下代码:
Logger.d(LOG_TAG, "Enter retrieveImageData()");
URL url = new URL(imageUrl);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setReadTimeout(CONNECTTION_TIMEOUT);
// determine the image size and allocate a buffer
int fileSize = connection.getContentLength();
if (fileSize < 0) {
Logger.d(LOG_TAG, "retrieveImageData()->file size less than 0");
return null;
}
byte[] imageData = null;
byte[] buffer = new byte[BUFFER_SIZE];
// download the file
// if(Global.show_logs) Log.d(LOG_TAG, "fetching image " + imageUrl +
// " (" + fileSize + ")");
BufferedInputStream istream = new BufferedInputStream(connection.getInputStream());
if ((!(height == -1)) && (!(width == -1))) {
Logger.d(LOG_TAG, "Enter retrieveImageData() :width="+width+" height"+height);
File tmpFile = GlobalFunctions.getTmpFile();
if (tmpFile == null)
throw new IOException("DroidFu::ImageLoader: Could not create temp file!");
BufferedOutputStream ostream = new BufferedOutputStream(new FileOutputStream(tmpFile));
Logger.d(LOG_TAG, "before call of IOUtils.copy");
IOUtils.copy(istream, ostream);
Logger.d(LOG_TAG, "after call of IOUtils.copy");
// First decode with inJustDecodeBounds=true to check dimensions
final BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeFile(tmpFile.getAbsolutePath(), options);
// Calculate inSampleSize
Logger.d(LOG_TAG, "before call of calculateInSampleSize()");
options.inSampleSize = calculateInSampleSize(options, width, height);
Logger.d(LOG_TAG, "after call of calculateInSampleSize()");
// Decode bitmap with inSampleSize set
options.inJustDecodeBounds = false;
Logger.d(LOG_TAG, "Absolute path of tmp file is: "+tmpFile.getAbsolutePath());
Bitmap b=BitmapFactory.decodeFile(tmpFile.getAbsolutePath(), options);
ByteArrayOutputStream stream = new ByteArrayOutputStream();
b.compress(Bitmap.CompressFormat.PNG, 100, stream);
byte[] byteArray = stream.toByteArray();
b.recycle();
//imageData = stream.toByteArray();
istream.close();
ostream.close();
stream.close();
Logger.d(LOG_TAG, "Exit retrieveImageData() after resizing to imageview");
return byteArray;
}
但是这个代码在这一行抛出异常(Throwable e),而且“e”也是null:
b.compress(Bitmap.CompressFormat.PNG, 100, stream);
byte[] byteArray = stream.toByteArray();
答案 0 :(得分:8)
试试这个。
将位图转换为字节数组: -
Bitmap bmp = BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher);
ByteArrayOutputStream stream = new ByteArrayOutputStream();
bmp.compress(Bitmap.CompressFormat.PNG, 100, stream);
byte[] byteArray = stream.toByteArray();
将字节数组转换为位图图像: -
Bitmap bmp = BitmapFactory.decodeByteArray(byteArray, 0, byteArray.length);
答案 1 :(得分:4)
将位图转换为字节数组,您可以使用
final int lnth=bitmap.getByteCount();
ByteBuffer dst= ByteBuffer.allocate(lnth);
bitmap.copyPixelsToBuffer( dst);
byte[] barray=dst.array();
从字节数组中获取位图
Bitmap bitmap = new BitmapFactory().decodeByteArray(byte_array, 0/* starting index*/, byte_array.length/*no of byte to read*/)
答案 2 :(得分:4)
以下是更高级image Loader library
的链接用法如下:
首先将此代码放入您的主要活动中。
DisplayImageOptions defaultOptions = new DisplayImageOptions.Builder().showStubImage(R.drawable.ic_stub).showImageOnFail(R.drawable.ic_error).showImageForEmptyUri(R.drawable.ic_empty_url).cacheInMemory().cacheOnDisc().build();
// Create global configuration and initialize ImageLoader with this
// configuration
ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(getApplicationContext()).defaultDisplayImageOptions(defaultOptions).build();
ImageLoader.getInstance().init(config);
然后在你的班级中使用它:
private ImageLoader imageLoader;
在你的onCreate()方法中
imageLoader = ImageLoader.getInstance()
;
然后像这样加载图片
imageLoader.displayImage(IMG_URL, imageView);