Bitmap內(nèi)存處理

Bitmap內(nèi)存處理

在Android開發(fā)中滔迈,Bitmap對象通常占用大量內(nèi)存燎悍,尤其是在處理高分辨率圖像時谈山。優(yōu)化Bitmap的內(nèi)存使用對于提高應用性能和避免內(nèi)存溢出(OutOfMemoryError)至關重要奏路。以下是一些常見的Bitmap內(nèi)存優(yōu)化方法:

1. 使用合適的圖像分辨率

*   根據(jù)顯示需求加載適當分辨率的圖像鸽粉。例如,如果圖像只需在小的ImageView中顯示帚戳,則無需加載高分辨率的圖像片任。
*   使用`BitmapFactory.Options`類中的`inSampleSize`屬性來在解碼時對圖像進行下采樣对供。這可以在不降低圖像質(zhì)量的情況下減少內(nèi)存使用犁钟。

在Android開發(fā)中,加載大圖片時很容易消耗大量內(nèi)存炬灭,從而導致OutOfMemoryError重归。使用BitmapFactory.Options類中的inSampleSize屬性可以在解碼圖像時對圖像進行下采樣鼻吮,從而減少內(nèi)存使用椎木。下采樣是降低圖像分辨率的過程博烂,通過該過程可以減小圖像的尺寸禽篱,但并不會明顯降低圖像的視覺質(zhì)量(在一定范圍內(nèi))躺率。

下面是一個具體的實現(xiàn)步驟:

  1. 計算inSampleSize的值:
    根據(jù)圖像的原始尺寸和目標尺寸,計算出合適的inSampleSize良狈。
    inSampleSize是解碼時對圖像寬高進行縮放的倍數(shù)们颜,它的值必須是2的冪(如1窥突、2硫嘶、4沦疾、8等)哮塞。
  2. 配置BitmapFactory.Options:
    設置inSampleSize屬性忆畅。
    把BitmapFactory.Options傳遞給解碼方法家凯。
  3. 解碼圖像:
    使用BitmapFactory.decodeFile()绊诲、BitmapFactory.decodeResource()或BitmapFactory.decodeStream()等方法來解碼圖像掂之,并傳入配置好的BitmapFactory.Options板惑。
    以下是一個具體的代碼示例:
import android.graphics.Bitmap;  
import android.graphics.BitmapFactory;  
import android.util.Log;  
  
public class ImageUtil {  
  
    // 計算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;  
  
            // 計算最大值的采樣率洽胶,保持圖像尺寸大于需求的尺寸  
            while ((halfHeight / inSampleSize) >= reqHeight  
                    && (halfWidth / inSampleSize) >= reqWidth) {  
                inSampleSize *= 2;  
            }  
        }  
  
        return inSampleSize;  
    }  
  
    // 從文件中加載圖片的示例方法  
    public static Bitmap decodeSampledBitmapFromFile(String filePath,  
                                                     int reqWidth, int reqHeight) {  
  
        // 第一次解碼以獲取圖像尺寸  
        final BitmapFactory.Options options = new BitmapFactory.Options();  
        options.inJustDecodeBounds = true;  
        BitmapFactory.decodeFile(filePath, options);  
  
        // 計算inSampleSize  
        options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight);  
  
        // 第二次解碼以獲取實際圖像  
        options.inJustDecodeBounds = false;  
        return BitmapFactory.decodeFile(filePath, options);  
    }  
      
    // 從資源中加載圖片的示例方法  
    public static Bitmap decodeSampledBitmapFromResource(android.content.res.Resources res, int resId,  
                                                        int reqWidth, int reqHeight) {  
  
        // 第一次解碼以獲取圖像尺寸  
        final BitmapFactory.Options options = new BitmapFactory.Options();  
        options.inJustDecodeBounds = true;  
        BitmapFactory.decodeResource(res, resId, options);  
  
        // 計算inSampleSize  
        options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight);  
  
        // 第二次解碼以獲取實際圖像  
        options.inJustDecodeBounds = false;  
        return BitmapFactory.decodeResource(res, resId, options);  
    }  
  
}
// 從文件中加載圖片  
String filePath = "/path/to/your/image.jpg";  
int targetWidth = 1024;  // 目標寬度  
int targetHeight = 768;  // 目標高度  
Bitmap bitmap = ImageUtil.decodeSampledBitmapFromFile(filePath, targetWidth, targetHeight);  
  
// 從資源中加載圖片  
int resourceId = R.drawable.your_image;  
Bitmap bitmapFromResource = ImageUtil.decodeSampledBitmapFromResource(getResources(), resourceId, targetWidth, targetHeight);  
  
// 將Bitmap設置到ImageView中  
imageView.setImageBitmap(bitmap);

通過上述步驟丐怯,可以在加載圖像時有效地減少內(nèi)存使用读跷,避免OutOfMemoryError效览,同時盡量保持圖像的質(zhì)量丐枉。

2. 使用合適的圖像格式

*   選擇適當?shù)膱D像格式瘦锹。例如弯院,ARGB\_8888格式每個像素占用4個字節(jié)听绳,而RGB\_565格式每個像素只占用2個字節(jié)辫红。如果不需要透明度祝辣,可以選擇RGB\_565來減少內(nèi)存占用。
*   使用`Bitmap.Config`枚舉來選擇合適的圖像配置孕荠。

在Android開發(fā)中稚伍,選擇適當?shù)膱D像格式可以顯著影響應用程序的內(nèi)存使用和性能个曙。如果你不需要透明度信息,可以使用 RGB_565 格式受楼,它每個像素只占用2個字節(jié)垦搬,相比 ARGB_8888 每個像素4個字節(jié)的內(nèi)存占用呼寸,可以節(jié)省大量內(nèi)存。

以下是如何在Android中加載和設置不同圖像格式的示例代碼猴贰。

使用 BitmapFactory 解碼圖像并設置格式
當你從文件系統(tǒng)对雪、資源或輸入流中加載圖像時,可以使用 BitmapFactory 類米绕,并通過 BitmapFactory.Options 來設置圖像解碼的參數(shù)。

從資源中加載圖像:

// 從資源中加載圖片并設置為 RGB_565 格式  
public static Bitmap decodeSampledBitmapFromResource(Resources res, int resId, int reqWidth, int reqHeight) {  
    // 第一次解碼以獲取圖像尺寸  
    final BitmapFactory.Options options = new BitmapFactory.Options();  
    options.inJustDecodeBounds = true;  
    BitmapFactory.decodeResource(res, resId, options);  
  
    // 計算inSampleSize(縮放比例)  
    options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight);  
  
    // 設置解碼參數(shù)為非只讀取邊界栅干,并設置目標格式為 RGB_565  
    options.inJustDecodeBounds = false;  
    // This line is crucial to set the desired config  
    options.inPreferredConfig = Bitmap.Config.RGB_565;  
  
    // 第二次解碼以獲取實際圖像  
    return BitmapFactory.decodeResource(res, resId, options);  
}  
  
// 計算縮放比例的方法  
private 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;  
  
        while ((halfHeight / inSampleSize) >= reqHeight && (halfWidth / inSampleSize) >= reqWidth) {  
            inSampleSize *= 2;  
        }  
    }  
  
    return inSampleSize;  
}

從文件中加載圖像

// 從文件中加載圖片并設置為 RGB_565 格式  
public static Bitmap decodeSampledBitmapFromFile(String filePath, int reqWidth, int reqHeight) {  
    // 第一次解碼以獲取圖像尺寸  
    final BitmapFactory.Options options = new BitmapFactory.Options();  
    options.inJustDecodeBounds = true;  
    BitmapFactory.decodeFile(filePath, options);  
  
    // 計算inSampleSize(縮放比例)  
    options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight);  
  
    // 設置解碼參數(shù)為非只讀取邊界迈套,并設置目標格式為 RGB_565  
    options.inJustDecodeBounds = false;  
    // This line is crucial to set the desired config  
    options.inPreferredConfig = Bitmap.Config.RGB_565;  
  
    // 第二次解碼以獲取實際圖像  
    return BitmapFactory.decodeFile(filePath, options);  
}

使用 ImageView 設置圖像
加載完Bitmap后,可以將其設置到 ImageView 中進行顯示:

ImageView imageView = findViewById(R.id.imageView);  
Bitmap bitmap = decodeSampledBitmapFromResource(getResources(), R.drawable.your_image, 1024, 768);  
imageView.setImageBitmap(bitmap);

注意事項

  1. 質(zhì)量 vs 內(nèi)存:RGB_565 格式雖然節(jié)省內(nèi)存非驮,但色彩表現(xiàn)不如 ARGB_8888 豐富交汤。如果圖像質(zhì)量對你的應用至關重要,請慎重選擇劫笙。
    兼容性:大多數(shù)現(xiàn)代設備都能很好地處理
  2. RGB_565芙扎,但在某些特定場景下(如需要高精度顏色表現(xiàn)的圖像處理任務),可能需要使用 ARGB_8888填大。

通過適當選擇圖像格式和解碼參數(shù)戒洼,你可以在內(nèi)存使用和圖像質(zhì)量之間找到一個平衡點,從而提高應用的性能和用戶體驗允华。

ARGB_8888和RGB_565之外的格式

  1. ARGB_4444
    特點:ARGB_4444是一種16位的位圖配置圈浇,其中Alpha(透明度)、Red(紅色)靴寂、Green(綠色)和Blue(藍色)通道各占4位磷蜀。這意味著每個顏色通道只有16種可能的顏色值(從0到15),因此ARGB_4444的顏色精度相對較低百炬。
    適用場景:ARGB_4444適用于需要透明度但不需要高顏色精度的場合褐隆。由于它的內(nèi)存占用較小(每個像素16位)剖踊,因此在內(nèi)存受限的設備或應用程序中庶弃,ARGB_4444可能是一個合理的選擇。然而德澈,由于顏色精度的限制歇攻,ARGB_4444可能不適合顯示高質(zhì)量圖像或進行顏色敏感的圖像處理任務。
  2. ALPHA_8
    特點:ALPHA_8是一種8位的位圖配置梆造,它僅存儲透明度信息缴守,不包含顏色信息。每個像素只有8位,因此只能表示256種不同的透明度級別斧散。
    適用場景:ALPHA_8適用于僅需要透明度而不需要顏色信息的場合供常。例如,在圖像處理中鸡捐,你可能需要一個遮罩層來確定哪些部分應該被顯示或隱藏栈暇,而不需要關心這些部分的實際顏色。在這種情況下箍镜,ALPHA_8是一個高效且內(nèi)存占用小的選擇源祈。然而,由于它不包含顏色信息色迂,因此ALPHA_8不能用于顯示彩色圖像香缺。

3. 使用內(nèi)存緩存

*   利用`LruCache`或`DiskLruCache`等緩存機制來緩存已經(jīng)加載的Bitmap對象,避免重復加載和內(nèi)存浪費歇僧。
*   當內(nèi)存緊張時图张,可以自動回收不再使用的Bitmap對象,釋放內(nèi)存诈悍。

3.1 使用 LruCache:

import android.graphics.Bitmap;  
import android.graphics.BitmapFactory;  
import android.os.Bundle;  
import android.widget.ImageView;  
import androidx.annotation.Nullable;  
import androidx.appcompat.app.AppCompatActivity;  
import androidx.collection.LruCache;  
  
public class MainActivity extends AppCompatActivity {  
  
    private LruCache<String, Bitmap> bitmapCache;  
  
    @Override  
    protected void onCreate(@Nullable Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.activity_main);  
  
        // 初始化 LruCache  
        final int maxMemory = 4 * 1024 * 1024; // 4MB  
        // 設置緩存的最大大谢雎帧(例如,緩存中所有 Bitmap 對象的總大小不超過 4MB)  
        bitmapCache = new LruCache<String, Bitmap>(maxMemory) {  
            @Override  
            protected int sizeOf(String key, Bitmap bitmap) {  
                // 重寫此方法以測量 Bitmap 的大小侥钳,默認返回 Bitmap 占用的字節(jié)數(shù)  
                return bitmap.getByteCount();  
            }  
        };  
  
        ImageView imageView = findViewById(R.id.imageView);  
        String key = "example_bitmap_key";  
  
        // 嘗試從緩存中獲取 Bitmap  
        Bitmap bitmap = bitmapCache.get(key);  
  
        if (bitmap != null) {  
            // 使用緩存中的 Bitmap  
            imageView.setImageBitmap(bitmap);  
        } else {  
            // 加載 Bitmap(例如從資源中)  
            bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.example_image);  
            // 將 Bitmap 添加到緩存中  
            bitmapCache.put(key, bitmap);  
            // 設置 ImageView  
            imageView.setImageBitmap(bitmap);  
        }  
    }  
}

注意事項

  1. 緩存大惺释唷:設置適當?shù)木彺娲笮》浅V匾苑乐箖?nèi)存溢出舷夺。
  2. 鍵的唯一性:確保每個緩存項的鍵是唯一的苦酱,以便正確管理緩存。
  3. 線程安全:如果你的應用在多線程環(huán)境中操作緩存给猾,考慮使用 synchronized 塊或其他線程同步機制來確保線程安全疫萤。

3.2 使用 DiskLruCache

DiskLruCache 是一個由 Android 提供的磁盤緩存機制,它可以幫助我們緩存數(shù)據(jù)到磁盤中敢伸,以便在后續(xù)使用中能夠快速獲取给僵,從而減少重復加載和數(shù)據(jù)浪費。對于 Bitmap 對象的緩存详拙,我們可以使用 DiskLruCache 將 Bitmap 存儲到磁盤中,并在需要時從磁盤中讀取蔓同。

以下是一個使用 DiskLruCache 緩存 Bitmap 對象的基本實現(xiàn)步驟:

  1. 初始化 DiskLruCache:
    首先饶辙,我們需要指定緩存的目錄和緩存的最大大小來初始化 DiskLruCache。通常斑粱,緩存目錄可以選擇在應用的內(nèi)部存儲或外部存儲中弃揽。
  2. 將 Bitmap 寫入 DiskLruCache:
    當我們加載一個新的 Bitmap 時,可以將其寫入 DiskLruCache 中。我們需要將 Bitmap 轉(zhuǎn)換為一個字節(jié)數(shù)組或流矿微,然后將其存儲到緩存中痕慢。
  3. 從 DiskLruCache 讀取 Bitmap:
    在需要顯示 Bitmap 時,我們首先嘗試從 DiskLruCache 中讀取涌矢。如果緩存中存在該 Bitmap掖举,則直接將其讀出并顯示;否則娜庇,我們需要加載 Bitmap 并將其寫入緩存中塔次。
    下面是一個簡單的代碼示例,展示了如何使用 DiskLruCache 緩存 Bitmap 對象:
import android.content.Context;  
import android.graphics.Bitmap;  
import android.graphics.BitmapFactory;  
import android.os.Build;  
import androidx.annotation.RequiresApi;  
  
import com.jakewharton.disklrucache.DiskLruCache;  
  
import java.io.File;  
import java.io.IOException;  
import java.io.InputStream;  
import java.io.OutputStream;  
  
/**  
 * 一個簡單的 Bitmap 緩存類名秀,使用 DiskLruCache 進行磁盤緩存励负。  
 */  
public class BitmapCache {  
  
    // 磁盤緩存的最大大小,單位為字節(jié)匕得。這里設置為 10MB继榆。  
    private static final int DISK_CACHE_SIZE = 1024 * 1024 * 10;  
  
    // 緩存目錄的名稱。  
    private static final String CACHE_DIR = "bitmap_cache";  
  
    // DiskLruCache 實例汁掠。  
    private DiskLruCache diskLruCache;  
  
    /**  
     * 構(gòu)造函數(shù)略吨,初始化 DiskLruCache。  
     *  
     * @param context 上下文调塌,用于獲取緩存目錄晋南。  
     */  
    public BitmapCache(Context context) {  
        try {  
            // 獲取緩存目錄,如果不存在則創(chuàng)建羔砾。  
            File cacheDir = new File(context.getCacheDir(), CACHE_DIR);  
            if (!cacheDir.exists()) {  
                cacheDir.mkdirs();  
            }  
  
            // 初始化 DiskLruCache负间,設置緩存目錄、版本號姜凄、每個 key 對應的文件數(shù)量以及緩存總大小政溃。  
            diskLruCache = DiskLruCache.open(cacheDir, 1, 1, DISK_CACHE_SIZE);  
        } catch (IOException e) {  
            // 捕獲并打印異常信息。  
            e.printStackTrace();  
        }  
    }  
  
    /**  
     * 從緩存中獲取 Bitmap态秧。  
     *  
     * @param key 緩存的鍵董虱。  
     * @return 對應的 Bitmap 對象,如果緩存中不存在則返回 null申鱼。  
     */  
    public Bitmap getBitmap(String key) {  
        Bitmap bitmap = null;  
        try {  
            // 通過鍵獲取緩存的快照愤诱。  
            DiskLruCache.Snapshot snapshot = diskLruCache.get(key);  
            if (snapshot != null) {  
                // 如果快照存在,則從快照中獲取輸入流捐友,并解碼為 Bitmap淫半。  
                InputStream inputStream = snapshot.getInputStream(0);  
                bitmap = BitmapFactory.decodeStream(inputStream);  
                // 關閉快照以釋放資源。  
                snapshot.close();  
            }  
        } catch (IOException e) {  
            // 捕獲并打印異常信息匣砖。  
            e.printStackTrace();  
        }  
        return bitmap;  
    }  
  
    /**  
     * 將 Bitmap 存入緩存中科吭。  
     *  
     * @param key   緩存的鍵昏滴。  
     * @param bitmap 要緩存的 Bitmap 對象。  
     */  
    @RequiresApi(api = Build.VERSION_CODES.KITKAT)  
    public void putBitmap(String key, Bitmap bitmap) {  
        try {  
            // 通過鍵獲取緩存的編輯器对人。  
            DiskLruCache.Editor editor = diskLruCache.edit(key);  
            if (editor != null) {  
                // 如果編輯器獲取成功谣殊,則創(chuàng)建輸出流,并將 Bitmap 壓縮后寫入牺弄。  
                OutputStream outputStream = editor.newOutputStream(0);  
                bitmap.compress(Bitmap.CompressFormat.PNG, 100, outputStream);  
                // 刷新輸出流以確保數(shù)據(jù)寫入姻几。  
                outputStream.flush();  
                // 提交編輯,將數(shù)據(jù)真正寫入緩存猖闪。  
                editor.commit();  
            }  
        } catch (IOException e) {  
            // 捕獲并打印異常信息鲜棠。  
            e.printStackTrace();  
        }  
    }  
  
    /**  
     * 關閉 DiskLruCache,釋放資源培慌。  
     */  
    public void close() {  
        try {  
            if (diskLruCache != null) {  
                // 如果 DiskLruCache 不為空豁陆,則關閉它。  
                diskLruCache.close();  
            }  
        } catch (IOException e) {  
            // 捕獲并打印異常信息吵护。  
            e.printStackTrace();  
        }  
    }  
}

注意事項:

  1. 線程安全:DiskLruCache 本身不是線程安全的盒音,如果在多線程環(huán)境中使用,需要確保線程安全馅而。
  2. 緩存大邢榉獭:根據(jù)實際情況設置合適的緩存大小,避免占用過多磁盤空間瓮恭。
  3. 緩存鍵:選擇合適的緩存鍵雄坪,確保每個 Bitmap 對象都有唯一的鍵與之對應。
  4. 關閉緩存:在不再需要使用 DiskLruCache 時屯蹦,記得調(diào)用 close() 方法關閉緩存维哈,釋放資源。
  5. 異常處理:在實際應用中登澜,需要添加更多的異常處理邏輯阔挠,以確保應用的穩(wěn)定性和健壯性。

4. 及時回收Bitmap資源

*   當Bitmap對象不再需要時脑蠕,確保調(diào)用`bitmap.recycle()`方法來回收其占用的內(nèi)存购撼。
*   注意:在Android 4.0(API級別14)及更高版本中,如果Bitmap是通過`BitmapFactory`的解碼方法創(chuàng)建的谴仙,并且沒有通過`inMutable`選項設置為可變迂求,那么調(diào)用`recycle()`是安全的。但是晃跺,如果Bitmap是通過其他方式創(chuàng)建的(如從文件中讀瓤帧),則可能需要謹慎處理哼审。

5. 使用更小的圖像加載庫

*   考慮使用像Glide谐腰、Picasso或Fresco這樣的圖像加載庫。這些庫通常提供了高效的圖像加載涩盾、緩存和內(nèi)存管理功能十气,可以減少手動優(yōu)化Bitmap內(nèi)存的復雜性。

6. 避免在UI線程上解碼圖像

*   圖像解碼通常是一個耗時的操作春霍,應該在后臺線程上進行砸西,以避免阻塞UI線程。
*   使用異步任務或Handler來在后臺線程上解碼圖像址儒,并將解碼后的Bitmap傳遞回UI線程進行顯示芹枷。

7. 注意Bitmap對象的生命周期

*   確保在Activity或Fragment的適當生命周期方法中管理Bitmap對象的創(chuàng)建和銷毀。
*   在`onPause()`莲趣、`onStop()`或`onDestroy()`方法中釋放不再需要的Bitmap資源鸳慈。

通過采用這些優(yōu)化方法,可以顯著減少Bitmap對象對內(nèi)存的使用喧伞,提高Android應用的性能和穩(wěn)定性走芋。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市潘鲫,隨后出現(xiàn)的幾起案子翁逞,更是在濱河造成了極大的恐慌,老刑警劉巖溉仑,帶你破解...
    沈念sama閱讀 206,968評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件挖函,死亡現(xiàn)場離奇詭異,居然都是意外死亡浊竟,警方通過查閱死者的電腦和手機怨喘,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來逐沙,“玉大人哲思,你說我怎么就攤上這事》园福” “怎么了棚赔?”我有些...
    開封第一講書人閱讀 153,220評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長徘郭。 經(jīng)常有香客問我靠益,道長,這世上最難降的妖魔是什么残揉? 我笑而不...
    開封第一講書人閱讀 55,416評論 1 279
  • 正文 為了忘掉前任胧后,我火速辦了婚禮,結(jié)果婚禮上抱环,老公的妹妹穿的比我還像新娘壳快。我一直安慰自己纸巷,他們只是感情好,可當我...
    茶點故事閱讀 64,425評論 5 374
  • 文/花漫 我一把揭開白布眶痰。 她就那樣靜靜地躺著瘤旨,像睡著了一般。 火紅的嫁衣襯著肌膚如雪竖伯。 梳的紋絲不亂的頭發(fā)上存哲,一...
    開封第一講書人閱讀 49,144評論 1 285
  • 那天,我揣著相機與錄音七婴,去河邊找鬼祟偷。 笑死,一個胖子當著我的面吹牛打厘,可吹牛的內(nèi)容都是我干的修肠。 我是一名探鬼主播,決...
    沈念sama閱讀 38,432評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼婚惫,長吁一口氣:“原來是場噩夢啊……” “哼氛赐!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起先舷,我...
    開封第一講書人閱讀 37,088評論 0 261
  • 序言:老撾萬榮一對情侶失蹤艰管,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后蒋川,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體牲芋,經(jīng)...
    沈念sama閱讀 43,586評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,028評論 2 325
  • 正文 我和宋清朗相戀三年捺球,在試婚紗的時候發(fā)現(xiàn)自己被綠了缸浦。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,137評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡氮兵,死狀恐怖裂逐,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情泣栈,我是刑警寧澤卜高,帶...
    沈念sama閱讀 33,783評論 4 324
  • 正文 年R本政府宣布,位于F島的核電站南片,受9級特大地震影響掺涛,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜疼进,卻給世界環(huán)境...
    茶點故事閱讀 39,343評論 3 307
  • 文/蒙蒙 一薪缆、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧伞广,春花似錦拣帽、人聲如沸疼电。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽澜沟。三九已至,卻和暖如春峡谊,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背刊苍。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評論 1 262
  • 我被黑心中介騙來泰國打工既们, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人正什。 一個月前我還...
    沈念sama閱讀 45,595評論 2 355
  • 正文 我出身青樓啥纸,卻偏偏與公主長得像,于是被迫代替她去往敵國和親婴氮。 傳聞我的和親對象是個殘疾皇子斯棒,可洞房花燭夜當晚...
    茶點故事閱讀 42,901評論 2 345

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