Android:如何创建具有精确物理大小(以英寸为单位)的位图

时间:2015-04-03 02:36:51

标签: android image bitmap

我需要在android中创建一个位图并使用画布在其上绘制一些东西,最终将使用照片打印机打印。基本上我正在尝试创建一个实际5x7尺寸(5英寸×7英寸)的jpg。因此,如果将位图通过电子邮件发送或复制到计算机,它就可以正确地放入5X7照片打印纸中。

在createbitmap方法中指定高度和宽度时,我需要指定哪些值才能使位图的实际大小为5x7。这取决于设备的屏幕密度等吗?

2 个答案:

答案 0 :(得分:2)

试试这个方法:

public void setViewInInches(float width, float height, View v) {
    DisplayMetrics metrics = new DisplayMetrics();
    getWindowManager().getDefaultDisplay().getMetrics(metrics);
    int widthInches = Math.round(width * metrics.xdpi);
    int heightInches = Math.round(height * metrics.ydpi);
    v.setLayoutParams(new LinearLayout.LayoutParams(widthInches, heightInches));
    v.requestLayout();
}

传递宽度和高度,然后是要设置的视图,它应该可以工作。将图像视图设置为5x7的示例调用:

setViewInInches(5f, 7f, imageView);

答案 1 :(得分:2)

最终图像在纸张上打印的大小取决于打印机,但是您可以使用Bitmap.setDensity()给出提示它应该有多大。请注意,图像密度只是嵌入在图像文件中的数字元数据,由输出设备(即打印机)来解释或遵循提示。

如果您的像素大小为360x504像素并且您想要打印它的物理尺寸,则像素中的图像大小与您需要设置以达到一定大小所需的密度之间的关系是一个相当简单的数学5x7英寸,您需要将密度设置为:360px / 5英寸= 72ppi。

int IMAGE_WIDTH_IN_PIXEL = 360;
int IMAGE_HEIGHT_IN_PIXEL = 504;
float TARGET_WIDTH_IN_INCH = 5;
float TARGET_HEIGHT_IN_INCH = 7;
Bitmap bitmap = Bitmap.createBitmap(IMAGE_WIDTH_IN_PIXEL, IMAGE_HEIGHT_IN_PIXEL, Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(bitmap);
... draw something ...
// you need make sure the Bitmap had the same aspect ratio as the target printing size
assert IMAGE_WIDTH_IN_PIXEL / TARGET_WIDTH_IN_INCH == IMAGE_HEIGHT_IN_PIXEL / TARGET_HEIGHT_IN_INCH;
bitmap.setDensity(IMAGE_WIDTH_IN_PIXEL / TARGET_WIDTH_IN_INCH);
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, outfile);

请注意,打印图像的大小与设备的屏幕密度无关,后者决定了屏幕上图像的大小。

如果您有预定的打印密度,例如,大多数普通打印机可以打印至少300ppi,因为它是典型读取距离下pixelation不会出现的最低ppi。如果您有预设的ppi,那么当您将图像渲染到位图时,您需要控制的是图像像素大小。这种关系再次非常简单,要以5英寸宽的速度打印300ppi的图像,你需要300ppi * 5英寸= 1500像素宽的图像。

int TARGET_DENSITY = 300;
float PHYSICAL_WIDTH_IN_INCH = 5;
float PHYSICAL_HEIGHT_IN_INCH = 7;
Bitmap bitmap = Bitmap.createBitmap(PHYSICAL_WIDTH_IN_INCH * TARGET_DENSITY, PHYSICAL_HEIGHT_IN_INCH * TARGET_DENSITY, Bitmap.Config.ARGB_8888);
bitmap.setDensity(TARGET_DENSITY);
Canvas canvas = new Canvas(bitmap);
... draw something ...
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, outfile);

如果打印机服务支持它的另一种可能性是单独提交预期的物理尺寸以及打印请求。然后打印机将忽略嵌入的密度提示并计算以该大小打印所需的图像密度。