Android之優(yōu)雅地加載大圖片

轉(zhuǎn)載注明出處:http://www.reibang.com/p/0f56f35068e2

1. 引子

前幾天跟服務(wù)端的一個(gè)妹子聯(lián)調(diào)接口桨昙,服務(wù)器配置一張圖片讲弄,幾十KB就行措左,她問(wèn)我圖片從哪里找,我告訴她先隨便在網(wǎng)上找個(gè)圖片鏈接就行了避除。結(jié)果一運(yùn)行程序怎披,就崩潰了,出現(xiàn)了下面的異常瓶摆。

java.lang.OutofMemoryError

內(nèi)存溢出OOM凉逛,我當(dāng)時(shí)一臉懵逼。

一臉懵逼

于是拿著后臺(tái)返回的鏈接去查看了一下圖片赏壹,是一張6M的壁紙。

我內(nèi)心幾乎是崩潰的

這只是一個(gè)簡(jiǎn)單的聯(lián)調(diào)衔沼,而在聯(lián)調(diào)過(guò)程中操作不當(dāng)導(dǎo)致出現(xiàn)OOM問(wèn)題蝌借,大家就當(dāng)是個(gè)玩笑。其實(shí)在Android中很容易出現(xiàn)OOM的異常指蚁,特別是對(duì)圖片操作的時(shí)候菩佑,所以當(dāng)面對(duì)大圖片,需要我們對(duì)圖片進(jìn)行適當(dāng)?shù)膲嚎s凝化,在不影響圖片顯示的情況下稍坯,盡量保證不出現(xiàn)OOM的異常。

2. 概述

在開(kāi)發(fā)中搓劫,對(duì)于圖片的操作瞧哟,稍有不慎,可能就會(huì)消耗大量的內(nèi)存枪向,導(dǎo)致程序崩潰勤揩,所以了解一種通用的技術(shù)去處理和加載圖片,同時(shí)保證UI流暢避免OOM現(xiàn)象秘蛔,是非常有必要的陨亡。那么為什么在Android中對(duì)于圖片的處理會(huì)如此棘手呢傍衡?主要有以下一些原因:

  • 通常情況下,移動(dòng)設(shè)備的內(nèi)存資源是有限的负蠕,Android系統(tǒng)會(huì)根據(jù)手機(jī)的屏幕大小和密度蛙埂,為每個(gè)程序設(shè)置一個(gè)最大內(nèi)存限制,應(yīng)用程序消耗的內(nèi)存不能超過(guò)這個(gè)最大內(nèi)存限制遮糖,否則就會(huì)出現(xiàn)OOM現(xiàn)象绣的。當(dāng)然,這個(gè)內(nèi)存限制是跟手機(jī)配置相關(guān)聯(lián)的止吁。
  • 圖片的操作會(huì)消耗大量的內(nèi)存被辑,特別是細(xì)節(jié)豐富的圖片,例如照片敬惦。以Galaxy Nexus相機(jī)為例子盼理,它拍攝一張2592x1936像素的照片,如果使用的位圖配置是ARGB_8888(默認(rèn)從Android 2.3開(kāi)始)俄删,那么這張照片加載到內(nèi)存宏怔,大約會(huì)消耗19MB的內(nèi)存(2592 x 1936 x 4字節(jié)),僅僅是圖片消耗內(nèi)存的數(shù)值可能已經(jīng)超過(guò)了某些設(shè)備的內(nèi)存限制
  • Android的UI經(jīng)常會(huì)一次加載多張圖片畴椰,例如臊诊,ListView、GridView斜脂、ViewPager等等

圖片有各種形狀和大小抓艳。通常情況下,它們普遍比設(shè)備所需要的圖片要大一些帚戳,例如手機(jī)相冊(cè)顯示手機(jī)拍攝的照片玷或,而手機(jī)的相機(jī)分辨率大多時(shí)候是要高于手機(jī)屏幕的分辨率。鑒于手機(jī)的內(nèi)存有限片任,我們只需要在內(nèi)存中加載一個(gè)低分辨率的照片版本就可以了偏友,而這個(gè)低分辨率的照片應(yīng)該與顯示它的控件相匹配,這就需要對(duì)圖片進(jìn)行壓縮處理了对供。

Android中有兩種壓縮圖片的方法位他。

  • 第一種是針對(duì)圖片的長(zhǎng)寬進(jìn)行壓縮,在將圖片加載到內(nèi)存過(guò)程中將圖片的長(zhǎng)寬進(jìn)行壓縮产场,獲取長(zhǎng)寬壓縮版的的圖片
  • 第二種是針對(duì)圖片的像素進(jìn)行壓縮鹅髓,圖片加載到內(nèi)存后,針對(duì)圖片質(zhì)量進(jìn)行壓縮京景,會(huì)導(dǎo)致圖片質(zhì)量下降迈勋。

3. 圖片長(zhǎng)寬壓縮

3.1 獲取加載圖片的屬性

Android中的BitmapFactory類提供了一些解碼方法,decodeByteArray()醋粟、decodeFile()靡菇、decodeResource()等等重归,根據(jù)不通的圖片源選擇不同的解碼方法加載圖片創(chuàng)建出Bitmap。這些方法中都會(huì)傳入一個(gè)BitmapFactory.Options實(shí)例化對(duì)象厦凤,通過(guò)這個(gè)對(duì)象鼻吮,可以更改一些加載圖片的設(shè)置。由于這些解碼方法用于解碼加載圖片较鼓,會(huì)占用內(nèi)存構(gòu)建Bitmap椎木,因此很容易導(dǎo)致OOM的異常。
如果將options.inJustDecodeBounds設(shè)置為true博烂,在解碼過(guò)程中就不會(huì)申請(qǐng)內(nèi)存去創(chuàng)建Bitmap香椎,返回的是一個(gè)空的Bitmap,但是可以獲取圖片的一些屬性禽篱,例如圖片寬高畜伐,圖片類型等等。

BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;      // 設(shè)置為true躺率,不將圖片解碼到內(nèi)存中
BitmapFactory.decodeResource(getResources(), R.id.myimage, options);
int imageHeight = options.outHeight;    // 圖片高度
int imageWidth = options.outWidth;      // 圖片寬度
String imageType = options.outMimeType; // 圖片類型

一般來(lái)說(shuō)玛界,為了避免OOM的異常,在加載圖片到內(nèi)存之前悼吱,會(huì)先檢查圖片的尺寸慎框,除非你能確保圖片源不會(huì)導(dǎo)致OOM。

3.2 縮小圖片的長(zhǎng)寬來(lái)壓縮圖片

我們知道圖片的大小之后后添,就可以決定是否將完整的圖片加載到內(nèi)存或者加載壓縮版的圖片到內(nèi)存笨枯。可以基于以下幾點(diǎn)做出決定:

  • 估計(jì)完整圖片加載到內(nèi)存中所使用內(nèi)存
  • 可分配給加載圖片的內(nèi)存
  • 用于顯示圖片的控件的大小
  • 當(dāng)前設(shè)備的屏幕大小和密度

例如遇西,如果顯示圖片的控件大小為128x96像素馅精,就沒(méi)有必要將一個(gè)1024x768像素的圖片加載到內(nèi)存中。

設(shè)置options.inSampleSize的數(shù)值努溃,來(lái)控制壓縮圖片程度硫嘶。例如阻问,將options.inSampleSize設(shè)置為4梧税,將一個(gè)2048x1536像素的圖片解碼加載到內(nèi)存后產(chǎn)生的Bitmap大約為512x384像素,如果使用的位圖配置是ARGB_8888称近,那么僅僅需要0.75M就加載了縮小版的圖片到內(nèi)存第队,而加載完整的圖片需要12M。

也就是說(shuō)刨秆,如果我們?cè)O(shè)置inSampleSize == 2凳谦,解碼出來(lái)的位圖的寬高是原圖的1/2,圖片所占用內(nèi)存縮小了1/4(1/2 x 1/2)衡未。如果inSampleSize設(shè)置的值小于等1尸执,都會(huì)當(dāng)做inSampleSize == 1來(lái)解碼加載圖片家凯。

于是我們可以在加載圖片的時(shí)候如失,根據(jù)控件的大邪砘濉(顯示到屏幕上的大小)來(lái)計(jì)算出加壓縮版圖片的inSampleSize值掂之。

    /**
     * 計(jì)算inSampleSize值
     *
     * @param options
     *          用于獲取原圖的長(zhǎng)寬
     * @param reqWidth
     *          要求壓縮后的圖片寬度
     * @param reqHeight
     *          要求壓縮后的圖片長(zhǎng)度
     * @return
     *          返回計(jì)算后的inSampleSize值
     */
    public static int calculateInSampleSize(BitmapFactory.Options options, int reqWidth, int reqHeight) {
        // 原圖片的寬高
        final int height = options.outHeight;
        final int width = options.outWidth;
        int inSampleSize = 1;

        if (height > reqHeight || width > reqWidth) {

            final int halfHeight = height / 2;
            final int halfWidth = width / 2;

            
            // 計(jì)算inSampleSize值
            while ((halfHeight / inSampleSize) >= reqHeight
                    && (halfWidth / inSampleSize) >= reqWidth) {
                inSampleSize *= 2;
            }
        }

        return inSampleSize;
    }

有人可能會(huì)疑問(wèn)為什么每次inSampleSize都是乘以2,指數(shù)增長(zhǎng)跟压。這是因?yàn)樵诩虞d圖片過(guò)程中晒夹,解析器使用的inSampleSize都是2的指數(shù)倍丐怯,如果inSampleSize是其他值喷好,則找一個(gè)離這個(gè)值最近的2的指數(shù)值。

上面已經(jīng)獲取了inSampleSize读跷,然后就可以根據(jù)這個(gè)值來(lái)加載壓縮版的圖片了梗搅。

public static Bitmap decodeSampledBitmapFromResource(Resources res, int resId,
        int reqWidth, int reqHeight) {
    // 先將inJustDecodeBounds設(shè)置為true來(lái)獲取圖片的長(zhǎng)寬屬性
    final BitmapFactory.Options options = new BitmapFactory.Options();
    options.inJustDecodeBounds = true;
    BitmapFactory.decodeResource(res, resId, options);

    // 計(jì)算inSampleSize
    options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight);

    // 加載壓縮版圖片
    options.inJustDecodeBounds = false;
    // 根據(jù)具體情況選擇具體的解碼方法
    return BitmapFactory.decodeResource(res, resId, options);
}

獲取到了壓縮版的Bitmap之后就可以直接設(shè)置到屏幕的控件上了。

mImageView.setImageBitmap(
    decodeSampledBitmapFromResource(getResources(), R.id.myimage, 100, 100));

4. 圖片質(zhì)量壓縮

4.1 方法介紹

上面一種方法是通過(guò)縮放圖片的大小來(lái)達(dá)到壓縮效果效览,基本不會(huì)對(duì)圖片的顯示效果有影響无切。但是現(xiàn)在介紹的這一種方法,可能會(huì)導(dǎo)致圖片質(zhì)量下降丐枉。

使用的是下面這個(gè)方法來(lái)進(jìn)行壓縮哆键。

Bitmap.compress(CompressFormat format, int quality, OutputStream stream)

這個(gè)方法有三個(gè)參數(shù),是布爾類型的返回值

  • CompressFormat 指定的Bitmap被壓縮成的圖片格式瘦锹,只支持JPEG籍嘹,PNG,WEBP三種
  • quality 圖片壓縮質(zhì)量的控制弯院,范圍為0~100辱士,0表示壓縮后體積最小,但是質(zhì)量也是最差听绳,100表示壓縮后體積最大颂碘,但是質(zhì)量也是最好的(個(gè)人認(rèn)為相當(dāng)于未壓縮),有些格式椅挣,例如png头岔,它是無(wú)損的塔拳,所以會(huì)忽略這個(gè)值。
  • OutputStream 壓縮后的數(shù)據(jù)會(huì)寫(xiě)入這個(gè)字節(jié)流中
  • 返回值表示返回的字節(jié)流是否可以使用BitmapFactory.decodeStream()解碼成Bitmap峡竣,至于返回值是怎么得到的蝙斜,因?yàn)槭荖ative的代碼,沒(méi)法找到邏輯澎胡。

4.2 色位深度介紹

接下來(lái)說(shuō)說(shuō)為什么用這個(gè)方法可能會(huì)導(dǎo)致圖片質(zhì)量下降孕荠。在Bitmap中有一個(gè)Config的屬性,這個(gè)屬性是用來(lái)描述每個(gè)像素被儲(chǔ)存的大小攻谁。目前Config有四個(gè)值:ALPHA_8稚伍、RGB_565ARGB_4444戚宦、ARGB_8888个曙。這個(gè)說(shuō)明一下(我個(gè)人的理解,真心不好解釋)受楼,每一個(gè)像素會(huì)可能由四個(gè)屬性組成垦搬,R(Red紅色通道)、G(Green綠色通道)、B(Blue藍(lán)色通道)、A(Alpha透明度通道)雨膨。

Config 每個(gè)像素占用的字節(jié) 說(shuō)明
ALPHA_8 1 bytes 每個(gè)像素僅僅儲(chǔ)存透明度通道
RGB_565 2 bytes 每個(gè)像素的RGB通道會(huì)保存淑趾,透明度不會(huì)保存布持,紅色通道5位,有2 ^ 5=32種表現(xiàn)形式;綠色通道6位,有2 ^ 6=64種表現(xiàn)形式栅干;藍(lán)色通道5位,有2 ^ 5=32種表現(xiàn)形式
ARGB_4444 2 bytes 每個(gè)像素的ARGB通道都會(huì)保存捐祠,透明度/紅色/綠色/藍(lán)色通道4位碱鳞,有2 ^ 4=16種表現(xiàn)形式
ARGB_8888 4 bytes 每個(gè)像素的ARGB通道都會(huì)保存,透明度/紅色/綠色/藍(lán)色通道8位踱蛀,有2 ^ 8=256種表現(xiàn)形式

有什么區(qū)別呢窿给?最簡(jiǎn)單的,當(dāng)一個(gè)顏色表現(xiàn)形式越多星岗,那么畫(huà)面整體的色彩就會(huì)更豐富填大,圖片質(zhì)量就會(huì)越高戒洼,當(dāng)然俏橘,圖片占用的儲(chǔ)存空間也越大。

4.3 圖片質(zhì)量下降原因介紹

前面提到過(guò)調(diào)用Bitmap.compress()方法時(shí)候圈浇,會(huì)傳入一個(gè)壓縮后的圖片格式寥掐,但是由于并不是所有的圖片格式都支持上面說(shuō)的Config的所有通道靴寂,比如說(shuō),JPEG格式的圖片召耘,是不支持Alpha(透明度)屬性的百炬,這樣將壓縮后返回的字節(jié)流通過(guò)BitmapFactory.decodeStream()轉(zhuǎn)換成Bitmap的過(guò)程中,會(huì)將透明度屬性給丟棄污它,導(dǎo)致圖片質(zhì)量下降剖踊。

4.4 壓縮過(guò)程介紹

壓縮過(guò)程如下,通過(guò)依次減少圖片質(zhì)量衫贬,將圖片大小控制在限制值范圍內(nèi)德澈。

/**
 * 壓縮圖片
 * 
 * @param bitmap
 *          被壓縮的圖片
 * @param sizeLimit
 *          大小限制
 * @return
 *          壓縮后的圖片
 */
private Bitmap compressBitmap(Bitmap bitmap, long sizeLimit) {
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    int quality = 100;
    bitmap.compress(Bitmap.CompressFormat.JPEG, quality, baos);

    // 循環(huán)判斷壓縮后圖片是否超過(guò)限制大小
    while(baos.toByteArray().length / 1024 > sizeLimit) {
        // 清空baos
        baos.reset();
        bitmap.compress(Bitmap.CompressFormat.JPEG, quality, baos);
        quality -= 10;
    }

    Bitmap newBitmap = BitmapFactory.decodeStream(new ByteArrayInputStream(baos.toByteArray()), null, null);
    
    return newBitmap;
}

5. 更近一步的優(yōu)化

上面提到的很多壓縮方法,如果是在UI線程執(zhí)行的話固惯,很有可能阻塞到主線程梆造,這是在開(kāi)發(fā)過(guò)程中非常不愿意見(jiàn)到的事情,所以我們需要在后臺(tái)線程去執(zhí)行這些壓縮圖片比較耗時(shí)的操作葬毫,然后獲取到壓縮后的圖片镇辉,設(shè)置到屏幕中。使用AsyncTask可以幫助我們很好的實(shí)現(xiàn)贴捡。

class BitmapWorkerTask extends AsyncTask<Integer, Void, Bitmap> {
    private final WeakReference<ImageView> imageViewReference;
    private int data = 0;

    public BitmapWorkerTask(ImageView imageView) {
        // 使用弱引用
        imageViewReference = new WeakReference<ImageView>(imageView);
    }

    // 在后臺(tái)線程壓縮圖片
    @Override
    protected Bitmap doInBackground(Integer... params) {
        data = params[0];
        return decodeSampledBitmapFromResource(getResources(), data, 100, 100));
    }

    // 壓縮完成后忽肛,將圖片設(shè)置到控件中
    @Override
    protected void onPostExecute(Bitmap bitmap) {
        if (imageViewReference != null && bitmap != null) {
            final ImageView imageView = imageViewReference.get();
            if (imageView != null) {
                imageView.setImageBitmap(bitmap);
            }
        }
    }
}

最終的執(zhí)行代碼。

    BitmapWorkerTask task = new BitmapWorkerTask(imageView);
    task.execute(resId);

6. 總結(jié)

圖片的處理烂斋,時(shí)刻都需要注意麻裁,因?yàn)闄C(jī)型配置的不同,以及現(xiàn)場(chǎng)設(shè)備內(nèi)存使用的情況源祈,都有可能導(dǎo)致OOM的現(xiàn)象煎源,上述提到了壓縮方法,基本適用與大部分圖片壓縮情況香缺。當(dāng)然如果對(duì)圖片畫(huà)質(zhì)顯示有要求手销,可能就需要特殊的處理了,這個(gè)就不在大部分場(chǎng)景的考慮內(nèi)图张。

7. 高斯模糊的建議

我在項(xiàng)目中遇見(jiàn)的關(guān)于圖片操作的OOM異常锋拖,有80%源自于高斯模糊。是的祸轮,有些產(chǎn)品經(jīng)理為了和iOS保持一致兽埃,需要將某些頁(yè)面背景設(shè)置成高斯模糊效果。

一般的做法是將上一個(gè)頁(yè)面截圖适袜,然后做高斯模糊處理柄错,設(shè)置成背景。正好我接受過(guò)這種需求,說(shuō)一下自己對(duì)于高斯模糊的建議售貌。

  • 確定產(chǎn)品經(jīng)理的需求给猾,高斯模糊的效果是不是一定要上。之前遇見(jiàn)一個(gè)需求颂跨,需要高斯模糊敢伸,結(jié)果Android做出來(lái)效果很不理想,后來(lái)恒削,我把背景直接設(shè)置成60%的透明度白色池颈。產(chǎn)品經(jīng)理看了之后,覺(jué)得Android的高斯模糊效果(其實(shí)是透明度)比iOS的要好一些钓丰,就讓iOS改饶辙。所以,一定要首先確認(rèn)產(chǎn)品經(jīng)理的需求斑粱,產(chǎn)品經(jīng)理想要的效果可能并不是他口中說(shuō)出的效果弃揽,就像我遇見(jiàn)的這位,可能誤將透明度和高斯模糊混合了则北。
  • 如果高斯模糊效果一定要上矿微。先將圖片長(zhǎng)寬縮小,然后壓縮圖片質(zhì)量尚揣,再進(jìn)行高斯模糊的渲染涌矢,最后將高斯模糊之后的效果圖放大至控件大小,顯示到屏幕快骗。
    • 縮放圖片長(zhǎng)寬
    • 壓縮圖片質(zhì)量
    • 高斯模糊渲染
    • 放大高斯模糊效果圖

最后娜庇,希望Android工程師不要遇見(jiàn)高斯模糊的需求,因?yàn)榉嚼海娴拿悖芸印5侨绻鲆?jiàn)了藕溅,也不要怕匕得,因?yàn)槟阋呀?jīng)知道該如何處理了。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末巾表,一起剝皮案震驚了整個(gè)濱河市汁掠,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌集币,老刑警劉巖考阱,帶你破解...
    沈念sama閱讀 206,723評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異鞠苟,居然都是意外死亡乞榨,警方通過(guò)查閱死者的電腦和手機(jī)秽之,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,485評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)姜凄,“玉大人,你說(shuō)我怎么就攤上這事趾访√恚” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,998評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵扼鞋,是天一觀的道長(zhǎng)申鱼。 經(jīng)常有香客問(wèn)我,道長(zhǎng)云头,這世上最難降的妖魔是什么捐友? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,323評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮溃槐,結(jié)果婚禮上匣砖,老公的妹妹穿的比我還像新娘。我一直安慰自己昏滴,他們只是感情好猴鲫,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,355評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著谣殊,像睡著了一般拂共。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上姻几,一...
    開(kāi)封第一講書(shū)人閱讀 49,079評(píng)論 1 285
  • 那天宜狐,我揣著相機(jī)與錄音,去河邊找鬼蛇捌。 笑死抚恒,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的络拌。 我是一名探鬼主播柑爸,決...
    沈念sama閱讀 38,389評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼盒音!你這毒婦竟也來(lái)了表鳍?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,019評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤祥诽,失蹤者是張志新(化名)和其女友劉穎譬圣,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體雄坪,經(jīng)...
    沈念sama閱讀 43,519評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡厘熟,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,971評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片绳姨。...
    茶點(diǎn)故事閱讀 38,100評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡登澜,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出飘庄,到底是詐尸還是另有隱情脑蠕,我是刑警寧澤,帶...
    沈念sama閱讀 33,738評(píng)論 4 324
  • 正文 年R本政府宣布跪削,位于F島的核電站谴仙,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏碾盐。R本人自食惡果不足惜晃跺,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,293評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望毫玖。 院中可真熱鬧掀虎,春花似錦、人聲如沸付枫。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,289評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)励背。三九已至春霍,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間叶眉,已是汗流浹背址儒。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,517評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留衅疙,地道東北人莲趣。 一個(gè)月前我還...
    沈念sama閱讀 45,547評(píng)論 2 354
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像饱溢,于是被迫代替她去往敵國(guó)和親喧伞。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,834評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

  • 2021期待與你一起共事绩郎,點(diǎn)擊查看崗位[http://www.reibang.com/p/6f4d67fa406...
    閑庭閱讀 16,610評(píng)論 0 75
  • 一直以來(lái)Bitmap都是開(kāi)發(fā)中很棘手的問(wèn)題潘鲫,這個(gè)問(wèn)題就是傳說(shuō)中的OOM(java.lang.OutofMemory...
    M悇芐冋憶閱讀 4,708評(píng)論 0 11
  • 在編寫(xiě)Android程序的時(shí)候經(jīng)常要用到許多圖片,不同圖片總是會(huì)有不同的形狀肋杖、不同的大小溉仑,但在大多數(shù)情況下,這些圖...
    讀行游閱讀 1,282評(píng)論 2 12
  • 先發(fā)一張昨天去看我雷哥演唱會(huì)的皂片然后再說(shuō)正文哈哈状植。 簡(jiǎn)介 由于工作原因浊竟,boss下達(dá)的任務(wù)就大概說(shuō)了對(duì)圖片進(jìn)行壓...
    我叫王菜鳥(niǎo)閱讀 5,208評(píng)論 2 16
  • 1.概述 在開(kāi)發(fā)中怨喘,對(duì)于圖片的操作,稍有不慎振定,可能就會(huì)消耗大量的內(nèi)存必怜,導(dǎo)致程序崩潰,所以了解一種通用的技術(shù)去處理和...
    GYLEE閱讀 487評(píng)論 0 8