小米手機調用相機,返回的相片只有176x142,怎麼解決?
這個是小米機默認的解析度。很坑新人。百度又百度不到,谷歌上又不研究小米。。
bug的原因是:安卓獲取Camera對象之後,camera可以獲取到一個返回的支持解析度的列表的,一般來說都在幾十個
Parameters parameters = camera.getParameters();
List&
大部分牌子的手機默認的都是最大解析度,缺點是有可能造成oom,比如三星s7e返回的bitmap就達到坑人的8兆。
但是小米的就奇葩的返回那個170*140的小圖,一般上百度找問題都找不到,讓人一頭霧水。。
解決方法,就是在返回的List&
Camera.Size pictureSize = supportedPictureSizes.get(0);// 從List取出Size
parameters.setPictureSize(previewSize.width, previewSize.height);// 設置照片的大小
camera.setParameters(parameters);
調用相機拍照,為了兼容性,一定要指定拍照生成的圖片的uri路徑,讓相機拍照的圖片就存那個文件,這樣你拍照成功後就不用在intent里讀data(或者其他欄位,國產rom各種不同),直接讀取你預先設置好的文件就行.
進一步講,不僅僅是拍照,從圖庫選擇圖片,以及裁剪也有一大堆坑,各家手機廠商都有他們自己的圖庫實現和裁剪實現,對於開發者來說,如果用系統的intent去做這兩件事,那麼bug永遠解決不完,所以現在都是用第三方庫.
基於我用過的幾個體驗最好的庫,我把拍照/圖庫選擇-&>裁剪-&>壓縮 整個流程都封裝了一下,代碼見這裡:
PhotoOut
ps: 我這裡的是intent調用,不涉及到直接的camera api操作.你如果是直接操作camera api,構建surfaceview來拍照,那麼解決方案是像其他幾個回答一樣,拿到本機器支持的camerasize,循環判斷,選一個與你的需求最接近的解析度,然後按這個解析度來拍照.
這個我真知道~~
前幾天也做了一個這種自定義相機的東西,簡單點說就是一個照相機截取的圖片可以返回很多種解析度,從大到小多大的都有,有的手機默認返回的480*800的但是小米返回的就特別小。
@祥子 祥子 同學說的基本就是核心部分了。
我做的方式是:取出所有的Camera.Size,然後用一個循環取一個跟屏幕分辨最接近的解析度。再設置到圖片里。
代碼的大概實現在下面。
this.getWindowManager().getDefaultDisplay().getSize(point);
int width = point.x;
int height = point.y;
float preferredRadio = (float)width/height;
List&
//find best revolution for pciture
float ratioDifferencePicture = 10000;
final int minSizeWidth = 480;
for (int i = 0; i &< sizeListForPicture.size(); i++) {
Camera.Size size = sizeListForPicture.get(i);
if (size.width &< minSizeWidth ||size.height &< minSizeWidth)
continue;
float currentratio = (float)size.width/size.height;
if ( Math.abs(currentratio - realPreferredRatio) &< ratioDifferencePicture ){
// Set the camera preview size
parameters.setPictureSize(size.width,size.height);
ratioDifferencePicture = Math.abs(currentratio - realPreferredRatio);
System.out.println("pciture======= size"+size.width +"height "+size.height+" "+(float)size.width/size.height);
}
}
mCamera.setParameters(parameters);
你用的哪款手機,具體的ROM版本號多少呢?
有按托尼提供的方法試試拍出來的照片的size嗎?
看你貼的這兩行代碼,是把previewSize設置到picturesize裡面了,有可能是這個原因導致的。
Camera.Size pictureSize = supportedPictureSizes.get(0);// 從List取出Size parameters.setPictureSize(previewSize.width, previewSize.height);// 設置照片的大小 camera.setParameters(parameters);
你拿的應該是縮略圖,可以指定uri,然後通過uri拿真實的圖,不過放入控制項之前還是先縮放
這是縮略圖吧,你拿全圖看看
推薦閱讀:
※Python 的跨平台圖形界面編程選用哪個庫為好?
※windows 下構建現代界面效果,用什麼庫或工具?
※為什麼 Mac 的窗口關閉,最小化、最大化按鈕在左上角,而 Windows 在右上角?
※什麼是界面(Interface),為什麼需要界面?