天天看點

三星手機拍照旋轉問題 調用相機拍照出現橫豎屏切換?

三星手機拍照旋轉問題 調用相機 拍照出現橫豎屏切換?

拍照擷取圖檔時,當應用是豎屏時,在部分手機上,如:三星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編輯器使用浏覽器離線存儲将内容儲存在本地。

使用者寫部落格的過程中,内容實時儲存在浏覽器緩存中,在使用者關閉浏覽器或者其它異常情況下,内容不會丢失。使用者再次打開浏覽器時,會顯示上次使用者正在編輯的沒有發表的内容。

部落格發表後,本地緩存将被删除。 

使用者可以選擇 把正在寫的部落格儲存到伺服器草稿箱,即使換浏覽器或者清除緩存,内容也不會丢失。

注意:雖然浏覽器存儲大部分時候都比較可靠,但為了您的資料安全,在聯網後,請務必及時發表或者儲存到伺服器草稿箱。

浏覽器相容

  1. 目前,本編輯器對Chrome浏覽器支援最為完整。建議大家使用較新版本的Chrome。
  2. IE9以下不支援
  3. IE9,10,11存在以下問題
    1. 不支援離線功能
    2. IE9不支援檔案導入導出
    3. IE10不支援拖拽檔案導入
  1. 這裡是 腳注 的 内容. ↩