androidexif
⑴ 請問:Android中怎麼獲取到圖片屬性上的地點信息,地點信息對應exif中key是什麼
地點的TAG就是經緯度信息
TAG_GPS_LATITUDE 緯度
TAG_GPS_LATITUDE_REF 緯度參考
TAG_GPS_LONGITUDE 經度
TAG_GPS_LONGITUDE_REF 經度參考
找個經緯度轉換工具轉成地址就好了(雖然沒試過,但Android自帶的geocoder恐怕是不行的,需要google的網路服務,而google的網路服務在大陸嘛……你懂的)
⑵ 如何解決Android三星手機從圖庫選擇照片旋轉問題
最近解決了一個令我頭疼好久的問題,就是三星手機拍照圖片旋轉的問題,項目中有上傳圖片的功能,那麼涉及到拍照,從相冊中選擇圖片,別的'手機都ok沒有問題,唯獨三星的手機拍照之後,你會很清楚的看到會把照片旋轉一下,然後你根據路徑找到的圖片就是已經被旋轉的了,解決辦法終於被我找到了。我們可以根據圖片的路徑讀取照片exif(Exchangeable Image File 可交換圖像文件)信息中的旋轉角度,至於這個EXIF可以看一下大牛的文章
Android 下的EXIF
根據調試,可以清楚的發現三星手機拍照的圖片的旋轉角度是90度,而別的手機旋轉角度是0度
看一下代碼:
/** * 讀取照片exif信息中的旋轉角度 * @param path 照片路徑 * @return角度 */ public static int readPictureDegree(String path) { int degree = 0; try { ExifInterface exifInterface = new ExifInterface(path); int orientation = exifInterface.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL); switch (orientation) { case ExifInterface.ORIENTATION_ROTATE_90: degree = 90; break; case ExifInterface.ORIENTATION_ROTATE_180: degree = 180; break; case ExifInterface.ORIENTATION_ROTATE_270: degree = 270; break; } } catch (IOException e) { e.printStackTrace(); } return degree; }
那麼我們只需要根據旋轉角度將圖片旋轉過來就OK了
public static Bitmap toturn(Bitmap img){ Matrix matrix = new Matrix(); matrix.postRotate(+90); /*翻轉90度*/ int width = img.getWidth(); int height =img.getHeight(); img = Bitmap.createBitmap(img, 0, 0, width, height, matrix, true); return img; }
輕松解決了,是不是很完美?
以上就是本文的全部內容,希望大家喜歡。
⑶ Android開發 camera拍照無法獲取Exit信息
private void data2file(byte[] w, String fileName) throws Exception {
FileOutputStream out = null;
try {
out = new FileOutputStream(fileName);
Bitmap bitmap = BitmapFactory.decodeByteArray(w, 0, w.length);
Matrix matrix=new Matrix();
matrix.postScale(1f, 1f);
//旋轉圖片
int deg = this.getWindowManager().getDefaultDisplay().getRotation();
if (deg == Surface.ROTATION_270) {
degree = 180;
matrix.postRotate(degree);
}
Bitmap dstbmp=Bitmap.createBitmap(bitmap,0,0,bitmap.getWidth(),
bitmap.getHeight(),matrix,true);
dstbmp.compress(CompressFormat.JPEG, 100, out);
//out.write(w);
out.flush();
out.close();
dstbmp.recycle();
bitmap.recycle();
} catch (Exception e) {
if (out != null)
out.close();
throw e;
}
}
生成圖片地址後可以做這樣處理,先旋轉到合適的角度,再保存。
⑷ 如何附加EXIF元數據在Android的序列化的Bitmap
例如:public static void main(String[] args) throws IOException{ List<Date> list=new ArrayList<Date>(); Date now=new Date(); list.add(now); list.add(new Date(now.getTime()+8888888)); ByteArrayOutputStream byteStream=new ByteArrayOutputStream(); ObjectOutput output=new ObjectOutputStream(byteStream); output.writeObject(list); byte b[]=byteStream.toByteArray(); BASE64Encoder base64Encoder=new BASE64Encoder(); String cookieString=base64Encoder.encode(b); System.out.println("經過BASE64編碼的Cookie:\n"+cookieString); System.out.println("\n開始解碼"); BASE64Decoder base64Decoder=new BASE64Decoder(); byte buf[]=base64Decoder.decodeBuffer(cookieString); ByteArrayInputStream byteArrayInputStream=new ByteArrayInputStream(buf); ObjectInput input=new ObjectInputStream(byteArrayInputStream); List<Date> afterList=(List<Date>) input.readObject(); for (Date date : afterList) { System.out.println(date); } }
補充:Android是一種基於Linux的自由及開放源代碼的操作系統,主要使用於移動設備,如智能手機和平板電腦,由Google公司和開放手機聯盟領導及開發。尚未有統一中文名稱,中國大陸地區較多人使用「安卓」或「安致」。
⑸ 如何附加EXIF元數據在Android的序列化的Bitmap
ByteArrayOutputStream bos = new ByteArrayOutputStream();
bitmap.compress(CompressFormat.JPEG, 100, bos); //Bitmap object is your image
byte[] data = bos.toByteArray();
TiffOutputSet outputSet = null;
IImageMetadata metadata = Sanselan.getMetadata(new File(filepath)); // filepath is the path to your image file stored in SD card (which contains exif info)
JpegImageMetadata jpegMetadata = (JpegImageMetadata) metadata;
if (null != jpegMetadata)
{
TiffImageMetadata exif = jpegMetadata.getExif();
if (null != exif)
{
outputSet = exif.getOutputSet();
}
}
if (null != outputSet)
{
bos.flush();
bos.close();
bos = new ByteArrayOutputStream();
ExifRewriter ER = new ExifRewriter();
ER.updateExifMetadataLossless(data, bos, outputSet);
data = bos.toByteArray(); //Update you Byte array, Now it contains exif information!
}
⑹ Android 開發中從相冊讀取的照片有時侯的方向不對,本來是豎屏的照片變成橫屏了怎麼辦
可以讀取相片的方向值,然後旋轉
讀取方向值請參照下面的代碼:
ExifInterface exifInterface = new ExifInterface(bitmapUrl);
int tag = exifInterface.getAttributeInt(ExifInterface.TAG_ORIENTATION, -1);
然後旋轉:
int degree = 0;
if (orc == ExifInterface.ORIENTATION_ROTATE_90) {
degree = 90;
} else if (orc == ExifInterface.ORIENTATION_ROTATE_180) {
degree = 180;
} else if (orc == ExifInterface.ORIENTATION_ROTATE_270) {
degree = 270;
}
if (degrees != 0 && bitmap != null) {
Matrix m = new Matrix();
m.setRotate(degrees, (float) bitmap.getWidth() / 2, (float) bitmap.getHeight() / 2);
}
⑺ Android 系統原生相機API角度原理與適配
雖然Camera作為第一代原生android所提供的相機類一直被開發者甚至Google官方開發人員所詬病,但為了兼容和適配Android版本5.0以下的App應用,我們別無選擇。因此,有了本篇文檔詳細闡述1.0版的Camera 是如何使用的。本篇使用的是SurfaceView與Camera類。
文檔下文會在拍照流程中的不同的階段應用到上述四個角度,而「終端自然方向」貫穿整個流程當中。這一個方向、四個角度非常重要,缺一不可,是支撐相機Camera 系列API的關鍵。在設計NXDesign的相機項目中,經過對官方文檔的研讀和各路資料的調研之後發現,我們在網路上查到的博客類相關資料有80%的實現方式是存在問題的,當然,這也可以歸咎於該API其本身確實不好用,如果不對源碼注釋進行仔細研究,很容易對開發者產生誤導。
更加准確的說,相機的生命周期是依託於SurfaceView的創建和銷毀來完成的。SurfaceView的作用是提供相機內容的實時預覽。我們需要在surfaceview創建好之後打開相機使用相機資源,在surfaceview被銷毀後釋放相機資源。
surfaceview 提供了holder機制向調用方通知surfaceview的變化時機,為了在不同的時機對相機資源做不同的事情,需要調用SurfaceHolder.addCallback()方法。
現在的Android手機一般會有多個攝像頭,但根據其方向可以歸為兩類: CAMERA_FACING_BACK 和 CAMERA_FACING_FRONT 。在打開攝像頭之前,首先需要獲取相機資源,判斷相機個數 Camera.getNumberOfCameras() 。每個相機對應一個CameraInfo,它的定義如下:
這里涉及到一個重要概念:相機圖像感測器(camera sensor),想要理解上述注釋的含義,就需要先理解下圖內容。
左圖是通常情況下,我們對view的x y方向的認知,以屏幕的左上角為原點向右為x正方向,向下為y正方向;但是,右圖描述的是絕大多數情況下, 相機圖像感測器 的起始位置和方向判定。與view不同的是,感測器以手機屏幕在自然方向上的右上角為原點,向下為x正方向,向左為y正方向。因此,我們理解上述注釋就不難了。如果相機自帶的感測器頂部與終端自然方向(手機屏幕的硬體方向,一般手機都是豎直方向,也就是文檔中說的naturally tall screen)的右邊緣一致,則這個值就是90度。如果前置攝像頭感測器的頂部與手機自然方向一致,則這個值就是270度。
當我們定義startCamera()方法時,要做5件事情,1.遍歷攝像頭cameraId,找到想要打開的攝像頭(前置還是後置);2.獲取攝像頭信息,主要獲取orientation;3. 設置相機DisplayOrientation 4.設置相機參數,主要是寬高比、對焦模式、圖片格式、setRotation等。5. 向camera設置surfaceview.viewholder,並且startPreview。主要邏輯如下:
拿到cameraInfo.orientation之後,要調用camera.setDisplayOrientation設置進去,保證通過surfaceview預覽到的取景跟當前的手機方向保持一致,但是,setDisplayOrientation設置的其實是經過兩個角度計算之後的復合角度,而並不單純是cameraInfo.orientation。正確的做法是這樣的:先獲取手機屏幕的旋轉方向,然後與cameraInfo.orientation加和得到最終角度。通常情況下,如果我們設置相機為portrait,則不用考慮rotation。這也是為什麼絕大部分網路資料中都會粗暴的寫入一個90度完事兒而並沒有解釋這么做的道理。
調用camera.takePicture(null, null, pictureCallback)
這里需要做的僅僅是將callback中返回的data存儲為File。需要注意的是,data中會包含setRotation()方法中的角度信息,因此如果直接使用Bitmap工具類生成bitmap,再進行存儲或者展示,生成出來的圖像其實是缺失了旋轉角度的原始方向,這十有八九會發生圖像展示角度錯誤的情況。因此,需要直接保存,再通過Exif工具類讀取File中的角度信息(當然Exif工具類就是為了讀取File中的各種信息而生的,比如拍照時間、經緯度等等)。
基於Camera API,
surfaceview的預覽需要setDisplayOrientation(),入參角度與CameraInfo.orientation(感測器偏角)和WindowManager.default.displayOrientation(屏幕旋轉角度)兩個角度有關。
相機拍照前需要setRotation(),入參角度與CameraInfo.orientation(感測器偏角)和OrientationEventListener返回的orientation(終端自然角度偏角)有關,二者的換算結果就是圖像寫入偏角,該偏角意味著圖像被順時針旋轉該角度就能夠回正展示。
⑻ 手機上怎麼查看圖片的exif信息,尤其是圖片GPS信息。。(安卓手機)
開了定位的才有gps
沒GPS功能的就沒那個信息
⑼ 智能手機(IOS,Android)通過瀏覽器上傳圖片 丟失exif等圖片信息
你說的那種上傳是要經過壓縮處理這一過程的!所以exif信息會被抹掉以節省數據量!
你的意思是不是想恢復exif? 我可以用編程演算法給你恢復出來!圖傳我
⑽ android開發,各位大神能幫我看看這個空指針異常是怎麼回事么
153行有個對象是null的。