我需要在android中創建一個位圖,並使用最終將使用照片打印機打印的畫布在其上繪製一些內容。基本上我試圖創建一個實際的5x7尺寸(5英寸X 7英寸)的JPG。因此,如果位圖通過電子郵件發送或複製到計算機,則它可以正確地放入5X7照片打印紙。Android:如何創建一個以英寸爲單位的確切物理尺寸的位圖
在createbitmap方法中指定高度和寬度時,需要指定哪些值才能生成位圖5x7的實際大小。這是否取決於設備的屏幕密度等?
我需要在android中創建一個位圖,並使用最終將使用照片打印機打印的畫布在其上繪製一些內容。基本上我試圖創建一個實際的5x7尺寸(5英寸X 7英寸)的JPG。因此,如果位圖通過電子郵件發送或複製到計算機,則它可以正確地放入5X7照片打印紙。Android:如何創建一個以英寸爲單位的確切物理尺寸的位圖
在createbitmap方法中指定高度和寬度時,需要指定哪些值才能生成位圖5x7的實際大小。這是否取決於設備的屏幕密度等?
試試這個方法:
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有一些不一致的結果,例如點燃第一代。不記得細節,我一定會嘗試這個並更新這個線程。 – 2015-04-04 12:54:45
我試過這種方法(以前曾經嘗試過這種方法)。它在不同的設備上創建不同的圖像大小。我在不同的設備上使用相同的代碼創建了圖像並將圖像複製到計算機上。它們都有不同的尺寸,例如當我選擇我的windows筆記本電腦上的圖像時,在HTC One S Mini上創建的圖像顯示爲2415 X 1729。三星Tab 10.1上創建的是2105 X 1505,Kindle Fire(第一代)顯示1152 X 828。我通過在Windows資源管理器中突出顯示圖像來檢查它,它顯示底部欄上的尺寸。 – 2015-04-18 19:59:28
多大的最終圖像打印在紙上是在打印機上,但你可以給它的提示應該多大用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,因爲這是最低的ppi,它在典型的閱讀距離下不會出現pixelation。如果你有一個預設的ppi,那麼當你將圖像渲染到位圖時,你需要控制的是圖像的像素大小。這種關係再次非常簡單,要在300ppi的5in寬打印圖像,您需要300ppi * 5 in = 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);
如果打印機服務支持它,另一種可能性是隨着打印請求單獨提交預期的物理尺寸。然後,打印機將忽略嵌入式密度提示並計算在該尺寸下打印所需的圖像密度。
嗯,看着http://stackoverflow.com/questions/21879142/android-how-to-get-or-set-print-dpi-dots-per-inch-of-jpeg-file-while-loa它確實當將圖像保存到文件時,不會出現Android實際使用setDensity()中設置的密度。如果是這種情況,那麼你可能需要自己編輯文件的密度,這將取決於圖像格式。 – 2015-04-03 04:50:13
有趣的是,這是有用的信息。將不得不嘗試在不同的設備,看看它的行爲,我會更新這個線程。 – 2015-04-04 12:52:48
到目前爲止我對這一個運氣不太好。不是關於打印,而是我的基本要求是創建一個固定尺寸的jpeg,而不管哪個設備創建圖像。我嘗試使用顯示指標,然後使用dpi乘以我所需的尺寸。但是,這是在不同設備上創建不同尺寸的圖像。當我考慮更多時,顯示指標可能與設備如何顯示圖像有關,而不是它如何存儲圖像。如果是這種情況,我如何設法在所有設備上創建一致的圖像。它甚至有可能嗎? – 2015-04-18 20:02:50
添加更多信息。是否有可能使用createbitmap和canvas在不同的設備中創建jpeg來在所有設備上生成一致維度的圖像?無論設備是否將圖像複製到計算機,所有圖像都應具有相同的尺寸,或多或少。它甚至是有道理的,或者我想知道如果我在這裏走錯了路。 – 2015-04-18 20:38:42