[英]How to set dpi image when saving it from bitmap in Android?
我使用此功能將位圖保存到 sdcard 上的文件:
private static File storeImage(Context context, Bitmap image) {
File pictureFile = getOutputMediaFile(context);
if (pictureFile == null) {
return null;
}
try {
FileOutputStream fos = new FileOutputStream(pictureFile);
image.compress(Bitmap.CompressFormat.PNG, 100, fos);
fos.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return pictureFile;
}
private static File getOutputMediaFile(Context context){
// To be safe, you should check that the SDCard is mounted
// using Environment.getExternalStorageState() before doing this.
File mediaStorageDir = new File(Environment.getExternalStorageDirectory()
+ "/Android/data/"
+ context.getPackageName()
+ "/Files");
// This location works best if you want the created images to be shared
// between applications and persist after your app has been uninstalled.
// Create the storage directory if it does not exist
if (! mediaStorageDir.exists()){
if (! mediaStorageDir.mkdirs()){
return null;
}
}
// Create a media file name
String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss", Locale.ENGLISH).format(new Date());
File mediaFile;
String mImageName="IMG_"+ timeStamp +".png";
mediaFile = new File(mediaStorageDir.getPath() + File.separator + mImageName);
return mediaFile;
}
當我打開文件並查看圖像 DPI 信息時,它像這樣顯示 72 像素/英寸
如何將其設置為 300 像素/英寸或其他值?
這是我用於管理屏幕截圖和調整圖像大小的一些輔助方法。
public static Bitmap getResizedBitmap(Bitmap bm, int newWidth, int newHeight, boolean recycleOriginal) {
int width = bm.getWidth();
int height = bm.getHeight();
// Determine scale to change size
float scaleWidth = ((float) newWidth) / width;
float scaleHeight = ((float) newHeight) / height;
// Create Matrix for maniuplating size
Matrix matrix = new Matrix();
// Set the Resize Scale for the Matrix
matrix.postScale(scaleWidth, scaleHeight);
//Create a new Bitmap from original using matrix and new width/height
Bitmap resizedBitmap = Bitmap.createBitmap(bm, 0, 0, width, height, matrix, false);
//Remove memory leaks if told to recycle, warning, if using original else where do not recycle it here
if(recycleOriginal) {
bm.recycle();
}
//Return the scaled new bitmap
return resizedBitmap;
}
public static Bitmap cropImage(Bitmap imgToCrop, int startX, int startY, int width, int height, boolean recycleOriginal){
Bitmap croppedImage = Bitmap.createBitmap(imgToCrop, startX, startY , width , height);
if(recycleOriginal){
imgToCrop.recycle();
}
return croppedImage;
}
public static Bitmap takeScreenshotOfView(Activity context, Bitmap.CompressFormat compressFormat){
Bitmap screenshot = null;
try {
// create bitmap screen capture
View v1 = context.getWindow().getDecorView().getRootView();
v1.setDrawingCacheEnabled(true);
screenshot = Bitmap.createBitmap(v1.getDrawingCache());
v1.setDrawingCacheEnabled(false);
File imageFile = new File(context.getFilesDir() + File.separator + "A35_temp" + File.separator + "screenshot_temp");
FileOutputStream outputStream = new FileOutputStream(imageFile);
int quality = 100;
screenshot.compress(compressFormat, quality, outputStream);
outputStream.flush();
outputStream.close();
} catch (Throwable e) {
// Several error may come out with file handling or OOM
e.printStackTrace();
}
return screenshot;
}
這些都是我的 ImageHelper 類的一部分,我只是使用它:
Bitmap screenshot = ImageHelper.takeScreenshotOfView(this, Bitmap.CompressFormat.JPEG);
Bitmap croppedImage = ImageHelper.cropImage(screenshot, ImageHelper.mStartXCrop, ImageHelper.mStartYCrop, ImageHelper.mCropWidth, ImageHelper.mCropHeight, true);
returnImage = ImageHelper.getResizedBitmap(croppedImage, mCropImageWidth, mCropImageHeight, false);
我認為您不是在嘗試截圖,但您仍然可以使用調整大小方法。
這些是我用來在保存時將dpi設置為位圖的方法,請參閱此處和此處。
public void storeImage(Bitmap image) {
try {
File pictureFile = new File("yourpath");
FileOutputStream fos = new FileOutputStream(pictureFile);
ByteArrayOutputStream imageByteArray = new ByteArrayOutputStream();
image.compress(Bitmap.CompressFormat.JPEG, 100, imageByteArray);
byte[] imageData = imageByteArray.toByteArray();
//300 will be the dpi of the bitmap
setDpi(imageData, 300);
fos.write(imageData);
fos.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
public void setDpi(byte[] imageData, int dpi) {
imageData[13] = 1;
imageData[14] = (byte) (dpi >> 8);
imageData[15] = (byte) (dpi & 0xff);
imageData[16] = (byte) (dpi >> 8);
imageData[17] = (byte) (dpi & 0xff);
}
300 dpi 非常適合打印,因此考慮到像素數,當您設置圖像的高度和寬度(以英寸為單位)時,乘以 300。例如。 喜歡創建位圖
Bitmap bm = Bitmap.createBitmap( W_inch*300 , H_inch*300 , Bitmap.Config.ARGB_8888);
它可能不會在圖像屬性/細節上顯示 300dpi,但質量將與 300 dpi 相同,因為 DPI 是每 1 英寸線的點數。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.