=>我们已经创建了一个图像编辑器。但是,我保存了编辑后的图像,然后图像分辨率下降了。
=>我的保存方法是:bitMap.compress(Bitmap.CompressFormat.PNG, 100, stream);
=>在android中以原始分辨率保存图像的任何想法。
=>任何库或其他方式
<com.example.shreejiweb.canvas.PaintView
android:id="@+id/paint_view"
android:background="@android:color/black"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
MainActivity
package com.example.shreejiweb.canvas;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.provider.MediaStore;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
public class MainActivity extends AppCompatActivity {
PaintView mPaintView;
Button mBtnPick,btn_save;
int mWidth;
int mHeight;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mWidth = mHeight = 0;
// Getting reference to PaintView
mPaintView = (PaintView) findViewById(R.id.paint_view);
// Getting reference to Button "Pick an Image"
mBtnPick = (Button) findViewById(R.id.btn_pick);
btn_save = findViewById(R.id.btn_save);
// Setting OnClickListener for the button
mBtnPick.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent i = new Intent();
i.setType("image/*");
i.setAction(Intent.ACTION_GET_CONTENT);
Intent customChooserIntent = Intent.createChooser(i, "Pick an image");
startActivityForResult(customChooserIntent, 10);
}
});
btn_save.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
View content = mPaintView;
content.setDrawingCacheEnabled(true);
content.setDrawingCacheQuality(View.DRAWING_CACHE_QUALITY_HIGH);
Bitmap bitmap = content.getDrawingCache();
String path = Environment.getExternalStorageDirectory().getAbsolutePath();
File file = new File(path+"/image.png");
FileOutputStream ostream;
try {
file.createNewFile();
ostream = new FileOutputStream(file);
bitmap.compress(Bitmap.CompressFormat.PNG, 100, ostream);
ostream.flush();
ostream.close();
Toast.makeText(getApplicationContext(), "image saved", Toast.LENGTH_LONG).show();
} catch (Exception e) {
e.printStackTrace();
Toast.makeText(getApplicationContext(), "error", Toast.LENGTH_LONG).show();
}
}
});
if (savedInstanceState != null) {
mWidth = savedInstanceState.getInt("width");
mHeight = savedInstanceState.getInt("height");
Bitmap bitmap = savedInstanceState.getParcelable("bitmap");
if (bitmap != null) {
mPaintView.addBitmap(bitmap);
}
}
}
// Courtesy : developer.android.com/training/displaying-bitmaps/load-bitmap.html
public static int calculateInSampleSize(
BitmapFactory.Options options, int reqWidth, int reqHeight) {
// Raw height and width of image
final int height = options.outHeight;
final int width = options.outWidth;
int inSampleSize = 1;
if (height > reqHeight || width > reqWidth) {
// Calculate ratios of height and width to requested height and width
final int heightRatio = Math.round((float) height / (float) reqHeight);
final int widthRatio = Math.round((float) width / (float) reqWidth);
// Choose the smallest ratio as inSampleSize value, this will guarantee
// a final image with both dimensions larger than or equal to the
// requested height and width.
inSampleSize = heightRatio < widthRatio ? heightRatio : widthRatio;
}
return inSampleSize;
}
private Bitmap getBitmapFromUri(Uri data) {
Bitmap bitmap = null;
// Starting fetch image from file
InputStream is = null;
try {
is = getContentResolver().openInputStream(data);
// First decode with inJustDecodeBounds=true to check dimensions
final BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
// BitmapFactory.decodeFile(path, options);
BitmapFactory.decodeStream(is, null, options);
// Calculate inSampleSize
// options.inSampleSize = calculateInSampleSize(options, mWidth, mHeight);
// Decode bitmap with inSampleSize set
options.inJustDecodeBounds = false;
is = getContentResolver().openInputStream(data);
bitmap = BitmapFactory.decodeStream(is, null, options);
if (bitmap == null) {
Toast.makeText(getBaseContext(), "Image is not Loaded", Toast.LENGTH_SHORT).show();
return null;
}
assert is != null;
is.close();
} catch (IOException | NullPointerException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return bitmap;
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent intent) {
// TODO Auto-generated method stub
super.onActivityResult(requestCode, resultCode, intent);
if (requestCode == 10 && resultCode == RESULT_OK && null != intent) {
Uri data = intent.getData();
Uri imageUri = intent.getData();
Bitmap bitmap = null;
try {
bitmap = MediaStore.Images.Media.getBitmap(this.getContentResolver(), imageUri);
} catch (IOException e) {
e.printStackTrace();
}
// Bitmap bitmap = getBitmapFromUri(data);
if (bitmap != null) {
mPaintView.addBitmap(bitmap);
}
}
}
@Override
public void onWindowFocusChanged(boolean hasFocus) {
// TODO Auto-generated method stub
super.onWindowFocusChanged(hasFocus);
mWidth = mPaintView.getWidth();
mHeight = mPaintView.getHeight();
}
@Override
protected void onSaveInstanceState(Bundle outState) {
outState.putInt("width", mWidth);
outState.putInt("height", mHeight);
if (mPaintView.getBitmap() != null) {
outState.putParcelable("bitmap", mPaintView.getBitmap());
}
super.onSaveInstanceState(outState);
}
@Override
protected void onResume() {
mPaintView.pause(false);
// Resume repainting
mPaintView.invalidate();
super.onResume();
}
@Override
protected void onPause() {
// Pause repainting
mPaintView.pause(true);
super.onPause();
}
}
答案 0 :(得分:0)
“原始分辨率”是位图,因此您只需要获取位图像素,然后将其写入到文件中即可添加文件头的文件:Android : save a Bitmap to bmp file format