【问题标题】:Android : How to create a bitmap with exact physical size in inchesAndroid:如何创建以英寸为单位的精确物理尺寸的位图
【发布时间】:2015-04-03 02:36:51
【问题描述】:

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

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

【问题讨论】:

  • 添加更多信息。甚至可以使用 createbitmap 和 canvas 在不同设备中创建 jpeg 以在所有设备上生成尺寸一致的图像吗?如果将图像复制到计算机,则无论使用何种设备,所有图像都应具有相同的尺寸,或多或少。这是否有意义,或者我想知道我是否在这里走错了路..

标签: android image bitmap


【解决方案1】:

试试这个方法:

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);

【讨论】:

  • 谢谢。过去我在某些设备上使用 getmetrics 得到了一些不一致的结果,例如第一代 kindle fire。不记得细节了,我一定会试试这个并更新这个帖子。
  • 我试过这个方法(之前为了不同的要求试过这个)。它在不同的设备上创建不同的图像大小。我在不同设备上使用相同的代码创建图像并将图像复制到计算机。它们都有不同的尺寸,例如,当我在 Windows 笔记本电脑上选择图像时,在 HTC One S Mini 上创建的图像显示为 2415 X 1729。在三星 Tab 10.1 上创建的是 2105 X 1505 ,Kindle Fire(第一代)显示 1152 X 828。我通过在 Windows 资源管理器上突出显示图像来检查这一点,它在底部栏上显示尺寸。
  • @saj-还有什么解决方案?
【解决方案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,那么当你将图像渲染到 Bitmap 时,你需要控制的是图像像素大小。这种关系再次非常简单,要以 300ppi 打印 5 英寸宽的图像,您需要 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);

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

【讨论】:

  • 嗯,看着stackoverflow.com/questions/21879142/…,在将图像保存到文件时,Android 似乎并没有实际使用 setDensity() 中设置的密度。如果是这种情况,那么您可能需要自己编辑文件的密度,这将取决于图像格式。
  • 有趣,这是有用的信息。将不得不在不同的设备上尝试,看看它的行为如何,我会更新这个线程。
  • 到目前为止,我对这个不走运。与打印无关,但我的基本要求是创建一个固定尺寸的 jpeg,而不管是哪个设备创建了图像。我尝试使用显示指标,然后使用 dpi 乘以我所需的尺寸。但这就是在不同的设备上创建不同大小的图像。当我更多地考虑它时,显示指标可能与设备如何显示图像有关,而不是它如何存储图像。如果是这种情况,我如何设法在所有设备中创建一致的图像。有可能吗?
猜你喜欢
  • 1970-01-01
  • 2013-07-19
  • 1970-01-01
  • 2016-10-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-03
  • 1970-01-01
相关资源
最近更新 更多