Android 圖片處理筆記

一任岸、插值法放大

參考【圖像縮放】雙立方(三次)卷積插值(Android版改寫)

思想是
1.拿到原始圖的所有像素點的哺哼,每個點的ARGB具體數值放到數組里沪铭。
2.按照比例關系算出目標尺寸圖對應點的對應像素點然后取原始圖的像素點數據串稀。

但是原方案粥庄,需要大量內存岖瑰,來回倒騰叛买,小圖還可以,
大圖4k
內存占用 = bitmap width * bitmap height * 4;
384021604/1024/1024=31.640625MB,
反復申請蹋订,折騰三下不得內存擠爆了率挣。

1.優(yōu)化:直接計算偏移量就好,

  public static boolean imgScaleNear2(byte[] srcbuffer, byte[] desBuffer, int srcW, int srcH, int destW, int destH) {

    float rowRatio = ((float) srcH) / ((float) destH);
    float colRatio = ((float) srcW) / ((float) destW);


    for (int row = 0; row < destH; row++) {

        int srcRow = Math.round(((float) row) * rowRatio);
        if (srcRow >= srcH) {
            srcRow = srcH - 1;
        }
        for (int col = 0; col < destW; col++) {
            int srcCol = Math.round(((float) col) * colRatio);
            if (srcCol >= srcW) {
                srcCol = srcW - 1;
            }
            int inpos = (srcRow*srcW  +srcCol)*4;
            int outpos = (row *destW+ col)*4;
            //填充部分

                desBuffer[outpos] = srcbuffer[inpos];
                desBuffer[outpos + 1] = srcbuffer[inpos + 1];
                desBuffer[outpos + 2] = srcbuffer[inpos + 2];
                desBuffer[outpos + 3] = srcbuffer[inpos + 3];

            //Log.e("tai","col=="+col+"=="+"row=="+row+"==");
        }

    }


    return false;
}

2.使用

                int bytes = bitmap.getByteCount();  //返回可用于儲存此位圖像素的最小字節(jié)數
                ByteBuffer buffer = ByteBuffer.allocate(bytes); //  使用allocate()靜態(tài)方法創(chuàng)建字節(jié)緩沖區(qū)

                bitmap.copyPixelsToBuffer(buffer); // 將位圖的像素復制到指定的緩沖區(qū)
                bitmap.recycle();


                ByteBuffer desBuffer = ByteBuffer.allocate(dWidth * dHeight * 4);
                buffer.position(0);
                desBuffer.position(0);
                BitmapUtils.imgScaleNear2(buffer.array(), desBuffer.array(), sWidth, sHeight, dWidth, dHeight);
                buffer.clear();

                desBuffer.position(0);
                Bitmap outbitmap = Bitmap.createBitmap(dWidth, dHeight, Bitmap.Config.ARGB_8888);
                outbitmap.copyPixelsFromBuffer(desBuffer);
                desBuffer.clear();


                savePicture(outbitmap);

                outbitmap.recycle();

3. buffer.position(0)作用露戒。

   RuntimeException: Buffer not large enough for pixels

buffer.position(0);//將buffer的下一讀寫位置置為0椒功。

4.配置清單申請更大的Heap

  android:largeHeap="true"

8k的圖片一張占
768043204/1024/1024=126.5625Mb
不申請是完全不夠的捶箱,大部分手機設備系統(tǒng)正常分配的內存最多為192M;當設置largeHeap時动漾,最多可申請512M丁屎。

打印測試工具

private void printCurrentMemory(String tag) {
    final Runtime runtime = Runtime.getRuntime();
    final long usedMemInMB = (runtime.totalMemory() - runtime.freeMemory()) / 1048576L;
    final long maxHeapSizeInMB = runtime.maxMemory() / 1048576L;
    final long availHeapSizeInMB = maxHeapSizeInMB - usedMemInMB;
    Log.e(TAG, tag + ",usedMemInMB=" + usedMemInMB + ",maxHeapSizeInMB=" + maxHeapSizeInMB + ",availHeapSizeInMB=" + availHeapSizeInMB);
}

二、照片添加坐標信息

直接寫進入是不行的要轉換成度分秒格式

  /**
 * 浮點型經緯度值轉成度分秒格式
 *
 * @param coord
 * @return
 */

public static String decimalToDMS(double coord) {
    String output, degrees, minutes, seconds;

    double mod = coord % 1;

    int intPart = (int) coord;

    degrees = String.valueOf(intPart);
    coord = mod * 60;

    mod = coord % 1;

    intPart = (int) coord;

    if (intPart < 0) {

        intPart *= -1;

    }
    minutes = String.valueOf(intPart);
    coord = mod * 60;

    intPart = (int) coord;

    if (intPart < 0) {
        intPart *= -1;
    }
    seconds = String.valueOf(intPart);

    output = degrees + "/1," + minutes + "/1," + seconds + "/1";
    return output;

}

/**
 * 將經緯度信息寫入JPEG圖片文件里
 *
 * @param picPath JPEG圖片文件路徑
 * @param dLat    緯度
 * @param dLon    經度
 */

public static void writeLatLonIntoJpeg(String picPath, double dLat, double dLon) {
    File file = new File(picPath);

    if (file.exists()) {
        try {
            ExifInterface exif = new ExifInterface(picPath);

            String tagLat = exif.getAttribute(ExifInterface.TAG_GPS_LATITUDE);

            String tagLon = exif.getAttribute(ExifInterface.TAG_GPS_LONGITUDE);

            if (tagLat == null && tagLon == null) {
                // 無經緯度信息
                exif.setAttribute(ExifInterface.TAG_GPS_LATITUDE, decimalToDMS(dLat));

                exif.setAttribute(ExifInterface.TAG_GPS_LATITUDE_REF, dLat > 0 ? "N" : "S"); // 區(qū)分南北半球

                exif.setAttribute(ExifInterface.TAG_GPS_LONGITUDE, decimalToDMS(dLon));

                exif.setAttribute(ExifInterface.TAG_GPS_LONGITUDE_REF, dLon > 0 ? "E" : "W"); // 區(qū)分東經西經

                exif.saveAttributes();

            }
            exif.setAttribute(ExifInterface.TAG_MODEL, Build.MODEL);
        } catch (Exception e) {
            Log.e("exif", e.getMessage());
        }

    }

}
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末旱眯,一起剝皮案震驚了整個濱河市悦屏,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌键思,老刑警劉巖础爬,帶你破解...
    沈念sama閱讀 218,122評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異吼鳞,居然都是意外死亡看蚜,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評論 3 395
  • 文/潘曉璐 我一進店門赔桌,熙熙樓的掌柜王于貴愁眉苦臉地迎上來供炎,“玉大人,你說我怎么就攤上這事疾党∫艚耄” “怎么了?”我有些...
    開封第一講書人閱讀 164,491評論 0 354
  • 文/不壞的土叔 我叫張陵雪位,是天一觀的道長竭钝。 經常有香客問我,道長雹洗,這世上最難降的妖魔是什么香罐? 我笑而不...
    開封第一講書人閱讀 58,636評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮时肿,結果婚禮上庇茫,老公的妹妹穿的比我還像新娘。我一直安慰自己螃成,他們只是感情好旦签,可當我...
    茶點故事閱讀 67,676評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著寸宏,像睡著了一般宁炫。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上击吱,一...
    開封第一講書人閱讀 51,541評論 1 305
  • 那天淋淀,我揣著相機與錄音,去河邊找鬼。 笑死朵纷,一個胖子當著我的面吹牛炭臭,可吹牛的內容都是我干的。 我是一名探鬼主播袍辞,決...
    沈念sama閱讀 40,292評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼鞋仍,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了搅吁?” 一聲冷哼從身側響起威创,我...
    開封第一講書人閱讀 39,211評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎谎懦,沒想到半個月后肚豺,有當地人在樹林里發(fā)現(xiàn)了一具尸體,經...
    沈念sama閱讀 45,655評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡界拦,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,846評論 3 336
  • 正文 我和宋清朗相戀三年吸申,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片享甸。...
    茶點故事閱讀 39,965評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡截碴,死狀恐怖,靈堂內的尸體忽然破棺而出蛉威,到底是詐尸還是另有隱情日丹,我是刑警寧澤,帶...
    沈念sama閱讀 35,684評論 5 347
  • 正文 年R本政府宣布蚯嫌,位于F島的核電站哲虾,受9級特大地震影響,放射性物質發(fā)生泄漏齐帚。R本人自食惡果不足惜妒牙,卻給世界環(huán)境...
    茶點故事閱讀 41,295評論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望对妄。 院中可真熱鬧,春花似錦敢朱、人聲如沸剪菱。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,894評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽孝常。三九已至,卻和暖如春蚓哩,著一層夾襖步出監(jiān)牢的瞬間构灸,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,012評論 1 269
  • 我被黑心中介騙來泰國打工岸梨, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留喜颁,地道東北人稠氮。 一個月前我還...
    沈念sama閱讀 48,126評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像半开,于是被迫代替她去往敵國和親隔披。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,914評論 2 355

推薦閱讀更多精彩內容