三星手機拍照旋轉問題 調用相機 拍照出現橫豎屏切換?
拍照擷取圖檔時,當應用是豎屏時,在部分手機上,如:三星note3上,圖檔不能正常顯示,會旋轉90°。
=_=
大概的思路就是拍照後擷取圖檔旋轉的角度,然後再回轉同樣的角度,一般均為0
1.調用拍照後,讀取臨時存儲的圖檔,temp為自定義的路徑
調用拍照
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
//下面這句指定調用相機拍照後的照片存儲的路徑
intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri
.fromFile(new File(Environment
.getExternalStorageDirectory(),
SQConstants.tempImgFile)));// SQConstants.tempImgFile檔案名public static final String tempImgFile = "/avatar.png";
//intent.putExtra(MediaStore.Images.Media.ORIENTATION, 0);
//intent.putExtra("return-data", true);
startActivityForResult(intent, SQConstants.AVATAR_CAMERA);//SQConstants.AVATAR_CAMERA為常量值,在傳回activity時使用,可自行定義
讀取圖檔Bitmap bm = BitmapsUtil.decodeFile(temp, 100);
private static final int DEFAULT_REQUIRED_SIZE = ;
public static Bitmap decodeFile(File f, int size) {
try {
BitmapFactory.Options option = new BitmapFactory.Options();
/**
inJustDecodeBounds如果将其設為true的話,在decode時将會傳回null。
通過此設定可以去查詢一個bitmap的屬性,比如bitmap的長和寬,而不占用記憶體大小.同時可避免OOM
*/
option.inJustDecodeBounds = true;
FileInputStream stream1 = new FileInputStream(f);
BitmapFactory.decodeStream(stream1, null, option);
stream1.close();
final int REQUIRED_SIZE = size > ? size : DEFAULT_REQUIRED_SIZE;
int width_tmp = option.outWidth, height_tmp = option.outHeight;
int scale = ;
while (true) {
if (width_tmp / < REQUIRED_SIZE
|| height_tmp / < REQUIRED_SIZE)
break;
width_tmp /= ;
height_tmp /= ;
scale *= ;
}
if (scale >= ) {
scale /= ;
}
BitmapFactory.Options option2 = new BitmapFactory.Options();
option2.inSampleSize = scale;
FileInputStream stream2 = new FileInputStream(f);
Bitmap bitmap = BitmapFactory.decodeStream(stream2, null, option2);
stream2.close();
return bitmap;
} catch (FileNotFoundException e) {
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
2.擷取圖檔旋轉的角度,然後給它旋轉回來
int degree = BitmapsUtil.readPictureDegree(temp.getAbsolutePath());
/**
* 擷取圖檔資訊
*
* @param path
* @return
*/
public static int readPictureDegree(String path) {
int degree = ;
try {
ExifInterface exifInterface = new ExifInterface(path);
int orientation = exifInterface.getAttributeInt(
ExifInterface.TAG_ORIENTATION,
ExifInterface.ORIENTATION_NORMAL);
switch (orientation) {
case ExifInterface.ORIENTATION_ROTATE_90:
degree = ;
break;
case ExifInterface.ORIENTATION_ROTATE_180:
degree = ;
break;
case ExifInterface.ORIENTATION_ROTATE_270:
degree = ;
break;
}
} catch (IOException e) {
e.printStackTrace();
}
return degree;
}
3.根據指定旋轉度數進行圖檔旋轉
Bitmap bitmap = BitmapsUtil.rotaingImageView(degree, bm);
/**
* 圖檔旋轉
*
* @param angle
* @param bitmap
* @return
*/
public static Bitmap rotaingImageView(int angle, Bitmap bitmap) {
// 旋轉圖檔 動作
Matrix matrix = new Matrix();
matrix.postRotate(angle);
System.out.println("angle=" + angle);
// 建立新的圖檔
Bitmap resizedBitmap = Bitmap.createBitmap(bitmap, , ,
bitmap.getWidth(), bitmap.getHeight(), matrix, true);
return resizedBitmap;
}
4.存儲旋轉後圖檔
compressHeadPhoto(bitmap);
private File rotateFile;
private void compressHeadPhoto(final Bitmap bm) {
rotateFile = new File(Environment.getExternalStorageDirectory(),
"rotate.png");
try {
bm.compress(Bitmap.CompressFormat.PNG, , new FileOutputStream(
rotateFile));
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
5.調用圖檔裁切
startPhotoZoom(Uri.fromFile(rotateFile));
/**
* 裁剪圖檔方法實作
* @param uri
*/
public void startPhotoZoom(Uri uri) {
Logs.i("startPhotoZoom uri: " + uri);
/*
* 至于下面這個Intent的ACTION是怎麼知道的,大家可以看下自己路徑下的如下網頁
* yourself_sdk_path/docs/reference/android/content/Intent.html
* 直接在裡面 Ctrl+F 搜:CROP
*
*/
Intent intent = new Intent("com.android.camera.action.CROP");
intent.setDataAndType(uri, "image/*");
//下面這個crop=true是設定在開啟的Intent中設定顯示的view可裁剪
intent.putExtra("crop", "true");
// aspectX aspectY 是寬高的比例
intent.putExtra("aspectX", );
intent.putExtra("aspectY", );
// outputX outputY 是裁剪圖檔寬高
intent.putExtra("outputX", );
intent.putExtra("outputY", );
intent.putExtra("return-data", true);
startActivityForResult(intent, SQConstants.AVATAR_C_A_DATA_IMG);
}
- Markdown和擴充Markdown簡潔的文法
- 代碼塊高亮
- 圖檔連結和圖檔上傳
- LaTex數學公式
- UML序列圖和流程圖
- 離線寫部落格
- 導入導出Markdown檔案
- 豐富的快捷鍵
快捷鍵
- 加粗
Ctrl + B
- 斜體
Ctrl + I
- 引用
Ctrl + Q
- 插傳入連結接
Ctrl + L
- 插入代碼
Ctrl + K
- 插入圖檔
Ctrl + G
- 提升标題
Ctrl + H
- 有序清單
Ctrl + O
- 無序清單
Ctrl + U
- 橫線
Ctrl + R
- 撤銷
Ctrl + Z
- 重做
Ctrl + Y
Markdown及擴充
Markdown 是一種輕量級标記語言,它允許人們使用易讀易寫的純文字格式編寫文檔,然後轉換成格式豐富的HTML頁面。 —— [ 維基百科 ]
使用簡單的符号辨別不同的标題,将某些文字标記為粗體或者斜體,建立一個連結等,詳細文法參考幫助?。
本編輯器支援 Markdown Extra , 擴充了很多好用的功能。具體請參考Github.
表格
Markdown Extra 表格文法:
項目 | 價格 |
---|---|
Computer | $1600 |
Phone | $12 |
Pipe | $1 |
可以使用冒号來定義對齊方式:
項目 | 價格 | 數量 |
---|---|---|
Computer | 1600 元 | 5 |
Phone | 12 元 | 12 |
Pipe | 1 元 | 234 |
定義清單
- Markdown Extra 定義清單文法: 項目1 項目2
- 定義 A
- 定義 B 項目3
- 定義 C
- 定義 D
定義D内容
代碼塊
代碼塊文法遵循标準markdown代碼,例如:
@requires_authorization
def somefunc(param1='', param2=):
'''A docstring'''
if param1 > param2: # interesting
print 'Greater'
return (param2 - param1 + ) or None
class SomeClass:
pass
>>> message = '''interpreter
... prompt'''
腳注
生成一個腳注1.
目錄
用
[TOC]
來生成目錄:
-
-
- 三星手機拍照旋轉問題 調用相機 拍照出現橫豎屏切換
- 快捷鍵
- Markdown及擴充
- 表格
- 定義清單
- 代碼塊
- 腳注
- 目錄
- 數學公式
- UML 圖
- 離線寫部落格
- 浏覽器相容
-
數學公式
使用MathJax渲染LaTex 數學公式,詳見math.stackexchange.com.
- 行内公式,數學公式為: Γ(n)=(n−1)!∀n∈N 。
- 塊級公式:
x=−b±b2−4ac−−−−−−−√2a
更多LaTex文法請參考 這兒.
UML 圖:
可以渲染序列圖:
或者流程圖:
- 關于 序列圖 文法,參考 這兒,
- 關于 流程圖 文法,參考 這兒.
離線寫部落格
即使使用者在沒有網絡的情況下,也可以通過本編輯器離線寫部落格(直接在曾經使用過的浏覽器中輸入write.blog.csdn.net/mdeditor即可。Markdown編輯器使用浏覽器離線存儲将内容儲存在本地。
使用者寫部落格的過程中,内容實時儲存在浏覽器緩存中,在使用者關閉浏覽器或者其它異常情況下,内容不會丢失。使用者再次打開浏覽器時,會顯示上次使用者正在編輯的沒有發表的内容。
部落格發表後,本地緩存将被删除。
使用者可以選擇 把正在寫的部落格儲存到伺服器草稿箱,即使換浏覽器或者清除緩存,内容也不會丢失。
注意:雖然浏覽器存儲大部分時候都比較可靠,但為了您的資料安全,在聯網後,請務必及時發表或者儲存到伺服器草稿箱。
浏覽器相容
- 目前,本編輯器對Chrome浏覽器支援最為完整。建議大家使用較新版本的Chrome。
- IE9以下不支援
- IE9,10,11存在以下問題
- 不支援離線功能
- IE9不支援檔案導入導出
- IE10不支援拖拽檔案導入
- 這裡是 腳注 的 内容. ↩