以原始形式保存图像并且不压缩
Posted
技术标签:
【中文标题】以原始形式保存图像并且不压缩【英文标题】:Save image in original form and without compressing 【发布时间】:2017-07-19 05:48:04 【问题描述】:我想保存图像而不压缩它,并希望以原始形式保存它,即当图像被压缩时,图像尺寸减小并且图像变小。为此,我正在使用本机相机。我在android studio
工作。我正在制作一个使用相机保存图像的应用程序。但是图像被压缩并且非常小并且质量非常低。
下面是我保存图片的代码
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data)
final LocationSettingsStates states = LocationSettingsStates.fromIntent(data);
if(requestCode == CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE)
if(resultCode == Activity.RESULT_OK)
Bitmap bmp = (Bitmap)data.getExtras().get("data");
ByteArrayOutputStream stream = new ByteArrayOutputStream();
bmp.compress(Bitmap.CompressFormat.JPEG, 100, stream);
byte[] byteArray = stream.toByteArray();
// convert byte array to Bitmap
Bitmap bitmap = BitmapFactory.decodeByteArray(byteArray, 0, byteArray.length);
if(isStoragePermissionGranted())
SaveImage(bitmap);
else
switch (requestCode)
case 1000:
switch (resultCode)
case Activity.RESULT_OK:
// All required changes were successfully made
getLocation();
break;
case Activity.RESULT_CANCELED:
// The user was asked to change settings, but chose not to
Toast.makeText(this, "Location Service not Enabled", Toast.LENGTH_SHORT).show();
break;
default:
break;
break;
private void SaveImage(Bitmap finalBitmap)
File storageDir = new File (String.valueOf(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES)));
String root = storageDir + Environment.getExternalStorageDirectory().getAbsolutePath().toString();
Log.v(LOG_TAG, root);
File myDir = new File(root + "/captured_images");
if (!myDir .exists())
myDir .mkdirs();
Random generator = new Random();
int n = 1000;
n = generator.nextInt(n);
String fname = "Image-" + n + ".jpg";
File file = new File(myDir,fname);
try
file.createNewFile();
MediaScannerConnection.scanFile(getApplicationContext(), new String[] file.getPath() , new String[]"image/*", null);
FileOutputStream out = new FileOutputStream(file);
finalBitmap.compress(Bitmap.CompressFormat.JPEG,100,out);
out.flush();
out.close();
catch (Exception e)
e.printStackTrace();
更新 1
为了更多的理解,我把我的onClick
方法
btn_camera.setOnClickListener(new View.OnClickListener()
@Override
public void onClick(View v)
// Check permission for camera
if(ActivityCompat.checkSelfPermission(MainActivity.this, CAMERA)
!= PackageManager.PERMISSION_GRANTED)
// Check Permissions Now
// Callback onRequestPermissionsResult interceptado na Activity MainActivity
ActivityCompat.requestPermissions(MainActivity.this,
new String[]CAMERA,
MainActivity.REQUEST_CAMERA);
else
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(intent, CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE );
);
我搜索了解决方案,发现我可以使用AndroidBitmapUtil
类,所以我将这个class 复制并粘贴到我的项目中,即我创建了一个新类。但我不知道如何使用它。虽然据说我可以通过new AndroidBmpUtil().save(bmImage, file);
保存图像。但我又无法与我的代码匹配:(
任何帮助将不胜感激
【问题讨论】:
相机应用程序将一个大文件保存到.../DCIM/Camera。但是您正在使用并保存图像的缩略图。因此质量低下。您应该提供相机应用程序将保存图像的相机意图的路径。基本的东西。你是问这个问题的####号。 @greenapps 请看我更新的代码 【参考方案1】:new AndroidBmpUtil().save(source, sdcardBmpPath);
用户高于代码行并遵循以下链接
https://github.com/ultrakain/AndroidBitmapUtil
【讨论】:
我已经弄清楚了一些事情并根据我的理解设置了代码,但是当我运行应用程序时它没有运行并给我错误Error:(39, 30) error: cannot find symbol method getWidth()
,Error:(40, 31) error: cannot find symbol method getHeight()
,Error:(62, 18) error: cannot find symbol method getPixels(int[],int,int,int,int,int,int)
这些都在AndroidBmpUtil
如果你知道如何解决这个问题,请告诉我。如果这个方法不能解决我的问题,我会尝试实现你提供的另一种方法【参考方案2】:
打开相机并将图像保存到某个特定目录。
解决方案编号 1
private String pictureImagePath = "";
private void openBackCamera()
String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
String imageFileName = timeStamp + ".jpg";
File storageDir = Environment.getExternalStoragePublicDirectory(
Environment.DIRECTORY_PICTURES);
pictureImagePath = storageDir.getAbsolutePath() + "/" + imageFileName;
File file = new File(pictureImagePath);
Uri outputFileUri = Uri.fromFile(file);
Intent cameraIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, outputFileUri);
startActivityForResult(cameraIntent, 1);
处理图片
protected void onActivityResult(int requestCode, int resultCode, Intent data)
if (requestCode == 1)
File imgFile = new File(pictureImagePath);
if(imgFile.exists())
Bitmap myBitmap = BitmapFactory.decodeFile(imgFile.getAbsolutePath());
ImageView myImage = (ImageView) findViewById(R.id.imageviewTest);
myImage.setImageBitmap(myBitmap);
解决方案 2
我使用了以下代码,这对我来说非常好。
values = new ContentValues();
values.put(MediaStore.Images.Media.TITLE, "New Picture");
values.put(MediaStore.Images.Media.DESCRIPTION, "From your Camera");
imageUri = getContentResolver().insert(
MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
startActivityForResult(intent, PICTURE_RESULT);
还有
protected void onActivityResult(int requestCode, int resultCode, Intent data)
switch (requestCode)
case PICTURE_RESULT:
if (requestCode == PICTURE_RESULT)
if (resultCode == Activity.RESULT_OK)
try
thumbnail = MediaStore.Images.Media.getBitmap(
getContentResolver(), imageUri);
imgView.setImageBitmap(thumbnail);
imageurl = getRealPathFromURI(imageUri);
catch (Exception e)
e.printStackTrace();
和
public String getRealPathFromURI(Uri contentUri)
String[] proj = MediaStore.Images.Media.DATA ;
Cursor cursor = managedQuery(contentUri, proj, null, null, null);
int column_index = cursor
.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
cursor.moveToFirst();
return cursor.getString(column_index);
【讨论】:
值是字符串类型? 我将在onCreate
方法中使用它。?
onclick方法内
是的,亲爱的朋友..请接受我的回答并增加我的声誉:-)
当我在做values = new ContentValues()
它给我错误不兼容的类型。我的声明是String values, imageUri
【参考方案3】:
用于打开相机使用
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
File f = new File(android.os.Environment.getExternalStorageDirectory(), "imagename.jpg");
intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(f));
startActivityForResult(intent, 1);
在你的 onActivityresult 方法中使用
if (requestCode == 1)
File f = new File(Environment.getExternalStorageDirectory().toString());
for (File temp : f.listFiles())
if (temp.getName().equals("imagename.jpg"))
f = temp;
break;
try
Bitmap bitmap;
BitmapFactory.Options bitmapOptions = new BitmapFactory.Options();
bitmap = BitmapFactory.decodeFile(f.getAbsolutePath(),bitmapOptions);
yourimageview.setImageBitmap(bitmap);
catch (Exception e)
e.printStackTrace();
【讨论】:
我可以在onClick
方法中打开相机我有` Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); startActivityForResult(intent, CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE);`
是的,没关系...但是我在打开相机时也在传递文件 uri。即..保存图像的位置。所以我猜它会在没有任何压缩的情况下保存
我没有使用图像视图,所以在哪里传递bitmap
?
使用 imageview 并不可取。您可以使用 onActivityResult 方法中的那段代码在应用程序的任何位置获取图像,以获取位图格式的图像。
让我们continue this discussion in chat。以上是关于以原始形式保存图像并且不压缩的主要内容,如果未能解决你的问题,请参考以下文章