欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Android實(shí)現(xiàn)圖片高斯模糊

 更新時(shí)間:2022年02月16日 10:55:12   投稿:lijiao  
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)圖片高斯模糊,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

本文實(shí)例為大家分享了Android實(shí)現(xiàn)圖片高斯模糊的具體代碼,供大家參考,具體內(nèi)容如下

原圖:

高斯模糊后:

FastBlur.java

import android.graphics.Bitmap;

/**
?* Description:
?* User: chenzheng
?* Date: 2017/2/22 0022
?* Time: 12:22
?*/
public class FastBlur {
? ? public static Bitmap doBlur(Bitmap sentBitmap, int radius,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? boolean canReuseInBitmap) {
? ? ? ? Bitmap bitmap;
? ? ? ? if (canReuseInBitmap) {
? ? ? ? ? ? bitmap = sentBitmap;
? ? ? ? } else {
? ? ? ? ? ? bitmap = sentBitmap.copy(sentBitmap.getConfig(), true);
? ? ? ? }

? ? ? ? if (radius < 1) {
? ? ? ? ? ? return (null);
? ? ? ? }

? ? ? ? int w = bitmap.getWidth();
? ? ? ? int h = bitmap.getHeight();

? ? ? ? int[] pix = new int[w * h];
? ? ? ? bitmap.getPixels(pix, 0, w, 0, 0, w, h);

? ? ? ? int wm = w - 1;
? ? ? ? int hm = h - 1;
? ? ? ? int wh = w * h;
? ? ? ? int div = radius + radius + 1;

? ? ? ? int r[] = new int[wh];
? ? ? ? int g[] = new int[wh];
? ? ? ? int b[] = new int[wh];
? ? ? ? int rsum, gsum, bsum, x, y, i, p, yp, yi, yw;
? ? ? ? int vmin[] = new int[Math.max(w, h)];

? ? ? ? int divsum = (div + 1) >> 1;
? ? ? ? divsum *= divsum;
? ? ? ? int dv[] = new int[256 * divsum];
? ? ? ? for (i = 0; i < 256 * divsum; i++) {
? ? ? ? ? ? dv[i] = (i / divsum);
? ? ? ? }

? ? ? ? yw = yi = 0;

? ? ? ? int[][] stack = new int[div][3];
? ? ? ? int stackpointer;
? ? ? ? int stackstart;
? ? ? ? int[] sir;
? ? ? ? int rbs;
? ? ? ? int r1 = radius + 1;
? ? ? ? int routsum, goutsum, boutsum;
? ? ? ? int rinsum, ginsum, binsum;

? ? ? ? for (y = 0; y < h; y++) {
? ? ? ? ? ? rinsum = ginsum = binsum = routsum = goutsum = boutsum = rsum = gsum = bsum = 0;
? ? ? ? ? ? for (i = -radius; i <= radius; i++) {
? ? ? ? ? ? ? ? p = pix[yi + Math.min(wm, Math.max(i, 0))];
? ? ? ? ? ? ? ? sir = stack[i + radius];
? ? ? ? ? ? ? ? sir[0] = (p & 0xff0000) >> 16;
? ? ? ? ? ? ? ? sir[1] = (p & 0x00ff00) >> 8;
? ? ? ? ? ? ? ? sir[2] = (p & 0x0000ff);
? ? ? ? ? ? ? ? rbs = r1 - Math.abs(i);
? ? ? ? ? ? ? ? rsum += sir[0] * rbs;
? ? ? ? ? ? ? ? gsum += sir[1] * rbs;
? ? ? ? ? ? ? ? bsum += sir[2] * rbs;
? ? ? ? ? ? ? ? if (i > 0) {
? ? ? ? ? ? ? ? ? ? rinsum += sir[0];
? ? ? ? ? ? ? ? ? ? ginsum += sir[1];
? ? ? ? ? ? ? ? ? ? binsum += sir[2];
? ? ? ? ? ? ? ? } else {
? ? ? ? ? ? ? ? ? ? routsum += sir[0];
? ? ? ? ? ? ? ? ? ? goutsum += sir[1];
? ? ? ? ? ? ? ? ? ? boutsum += sir[2];
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
? ? ? ? ? ? stackpointer = radius;

? ? ? ? ? ? for (x = 0; x < w; x++) {

? ? ? ? ? ? ? ? r[yi] = dv[rsum];
? ? ? ? ? ? ? ? g[yi] = dv[gsum];
? ? ? ? ? ? ? ? b[yi] = dv[bsum];

? ? ? ? ? ? ? ? rsum -= routsum;
? ? ? ? ? ? ? ? gsum -= goutsum;
? ? ? ? ? ? ? ? bsum -= boutsum;

? ? ? ? ? ? ? ? stackstart = stackpointer - radius + div;
? ? ? ? ? ? ? ? sir = stack[stackstart % div];

? ? ? ? ? ? ? ? routsum -= sir[0];
? ? ? ? ? ? ? ? goutsum -= sir[1];
? ? ? ? ? ? ? ? boutsum -= sir[2];

? ? ? ? ? ? ? ? if (y == 0) {
? ? ? ? ? ? ? ? ? ? vmin[x] = Math.min(x + radius + 1, wm);
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? p = pix[yw + vmin[x]];

? ? ? ? ? ? ? ? sir[0] = (p & 0xff0000) >> 16;
? ? ? ? ? ? ? ? sir[1] = (p & 0x00ff00) >> 8;
? ? ? ? ? ? ? ? sir[2] = (p & 0x0000ff);

? ? ? ? ? ? ? ? rinsum += sir[0];
? ? ? ? ? ? ? ? ginsum += sir[1];
? ? ? ? ? ? ? ? binsum += sir[2];

? ? ? ? ? ? ? ? rsum += rinsum;
? ? ? ? ? ? ? ? gsum += ginsum;
? ? ? ? ? ? ? ? bsum += binsum;

? ? ? ? ? ? ? ? stackpointer = (stackpointer + 1) % div;
? ? ? ? ? ? ? ? sir = stack[(stackpointer) % div];

? ? ? ? ? ? ? ? routsum += sir[0];
? ? ? ? ? ? ? ? goutsum += sir[1];
? ? ? ? ? ? ? ? boutsum += sir[2];

? ? ? ? ? ? ? ? rinsum -= sir[0];
? ? ? ? ? ? ? ? ginsum -= sir[1];
? ? ? ? ? ? ? ? binsum -= sir[2];

? ? ? ? ? ? ? ? yi++;
? ? ? ? ? ? }
? ? ? ? ? ? yw += w;
? ? ? ? }
? ? ? ? for (x = 0; x < w; x++) {
? ? ? ? ? ? rinsum = ginsum = binsum = routsum = goutsum = boutsum = rsum = gsum = bsum = 0;
? ? ? ? ? ? yp = -radius * w;
? ? ? ? ? ? for (i = -radius; i <= radius; i++) {
? ? ? ? ? ? ? ? yi = Math.max(0, yp) + x;

? ? ? ? ? ? ? ? sir = stack[i + radius];

? ? ? ? ? ? ? ? sir[0] = r[yi];
? ? ? ? ? ? ? ? sir[1] = g[yi];
? ? ? ? ? ? ? ? sir[2] = b[yi];

? ? ? ? ? ? ? ? rbs = r1 - Math.abs(i);

? ? ? ? ? ? ? ? rsum += r[yi] * rbs;
? ? ? ? ? ? ? ? gsum += g[yi] * rbs;
? ? ? ? ? ? ? ? bsum += b[yi] * rbs;

? ? ? ? ? ? ? ? if (i > 0) {
? ? ? ? ? ? ? ? ? ? rinsum += sir[0];
? ? ? ? ? ? ? ? ? ? ginsum += sir[1];
? ? ? ? ? ? ? ? ? ? binsum += sir[2];
? ? ? ? ? ? ? ? } else {
? ? ? ? ? ? ? ? ? ? routsum += sir[0];
? ? ? ? ? ? ? ? ? ? goutsum += sir[1];
? ? ? ? ? ? ? ? ? ? boutsum += sir[2];
? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? if (i < hm) {
? ? ? ? ? ? ? ? ? ? yp += w;
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
? ? ? ? ? ? yi = x;
? ? ? ? ? ? stackpointer = radius;
? ? ? ? ? ? for (y = 0; y < h; y++) {
? ? ? ? ? ? ? ? // Preserve alpha channel: ( 0xff000000 & pix[yi] )
? ? ? ? ? ? ? ? pix[yi] = (0xff000000 & pix[yi]) | (dv[rsum] << 16)
? ? ? ? ? ? ? ? ? ? ? ? | (dv[gsum] << 8) | dv[bsum];

? ? ? ? ? ? ? ? rsum -= routsum;
? ? ? ? ? ? ? ? gsum -= goutsum;
? ? ? ? ? ? ? ? bsum -= boutsum;

? ? ? ? ? ? ? ? stackstart = stackpointer - radius + div;
? ? ? ? ? ? ? ? sir = stack[stackstart % div];

? ? ? ? ? ? ? ? routsum -= sir[0];
? ? ? ? ? ? ? ? goutsum -= sir[1];
? ? ? ? ? ? ? ? boutsum -= sir[2];

? ? ? ? ? ? ? ? if (x == 0) {
? ? ? ? ? ? ? ? ? ? vmin[y] = Math.min(y + r1, hm) * w;
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? p = x + vmin[y];

? ? ? ? ? ? ? ? sir[0] = r[p];
? ? ? ? ? ? ? ? sir[1] = g[p];
? ? ? ? ? ? ? ? sir[2] = b[p];

? ? ? ? ? ? ? ? rinsum += sir[0];
? ? ? ? ? ? ? ? ginsum += sir[1];
? ? ? ? ? ? ? ? binsum += sir[2];

? ? ? ? ? ? ? ? rsum += rinsum;
? ? ? ? ? ? ? ? gsum += ginsum;
? ? ? ? ? ? ? ? bsum += binsum;

? ? ? ? ? ? ? ? stackpointer = (stackpointer + 1) % div;
? ? ? ? ? ? ? ? sir = stack[stackpointer];

? ? ? ? ? ? ? ? routsum += sir[0];
? ? ? ? ? ? ? ? goutsum += sir[1];
? ? ? ? ? ? ? ? boutsum += sir[2];

? ? ? ? ? ? ? ? rinsum -= sir[0];
? ? ? ? ? ? ? ? ginsum -= sir[1];
? ? ? ? ? ? ? ? binsum -= sir[2];

? ? ? ? ? ? ? ? yi += w;
? ? ? ? ? ? }
? ? ? ? }

? ? ? ? bitmap.setPixels(pix, 0, w, 0, 0, w, h);

? ? ? ? return (bitmap);
? ? }
}

調(diào)用方法:

private void applyBlur(String filePath) {
? ? ? ? int radius = 1;//模糊程度
? ? ? ? int scaleRatio = 5;
? ? ? ? Bitmap originBitmap = BitmapFactory.decodeFile(filePath, getBitmapOption(2)); //將圖片的長(zhǎng)和寬縮小味原來的1/2
? ? ? ? Bitmap scaledBitmap = Bitmap.createScaledBitmap(originBitmap,
? ? ? ? ? ? ? ? originBitmap.getWidth() / scaleRatio,
? ? ? ? ? ? ? ? originBitmap.getHeight() / scaleRatio,
? ? ? ? ? ? ? ? false);
? ? ? ? Bitmap blurBitmap = FastBlur.doBlur(scaledBitmap, radius, true);
? ? ? ? navLayout.setBackgroundDrawable(new BitmapDrawable(blurBitmap));
? ? }
private BitmapFactory.Options getBitmapOption(int inSampleSize){
? ? ? ? System.gc();
? ? ? ? BitmapFactory.Options options = new BitmapFactory.Options();
? ? ? ? options.inPurgeable = true;
? ? ? ? options.inSampleSize = inSampleSize;
? ? ? ? return options;
?}

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Android中Fragment的生命周期與返回棧的管理

    Android中Fragment的生命周期與返回棧的管理

    這篇文章主要介紹了Android中Fragment的生命周期與返回棧的管理,舉例講解了Fragment中addToBackStack()方法的使用,需要的朋友可以參考下
    2016-02-02
  • Flutter實(shí)現(xiàn)底部彈窗效果

    Flutter實(shí)現(xiàn)底部彈窗效果

    本文詳細(xì)講解了Flutter實(shí)現(xiàn)底部彈窗效果的方法,文中通過示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-11-11
  • 在Android環(huán)境下WebView中攔截所有請(qǐng)求并替換URL示例詳解

    在Android環(huán)境下WebView中攔截所有請(qǐng)求并替換URL示例詳解

    這篇文章主要介紹了在Android環(huán)境下WebView中攔截所有請(qǐng)求并替換URL示例詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07
  • 關(guān)于AndroidStudio R文件莫名其妙缺失的快速解決方法

    關(guān)于AndroidStudio R文件莫名其妙缺失的快速解決方法

    下面小編就為大家?guī)硪黄P(guān)于AndroidStudio R文件莫名其妙缺失的快速解決方法。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-03-03
  • android網(wǎng)絡(luò)圖片查看器簡(jiǎn)單實(shí)現(xiàn)代碼

    android網(wǎng)絡(luò)圖片查看器簡(jiǎn)單實(shí)現(xiàn)代碼

    這篇文章主要為大家詳細(xì)介紹了android網(wǎng)絡(luò)圖片查看器的簡(jiǎn)單實(shí)現(xiàn)代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-03-03
  • 在Kotlin開發(fā)中如何使用集合詳解

    在Kotlin開發(fā)中如何使用集合詳解

    這篇文章主要給大家介紹了關(guān)于在Kotlin開發(fā)中如何使用集合的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2018-03-03
  • Android中使用socket通信實(shí)現(xiàn)消息推送的方法詳解

    Android中使用socket通信實(shí)現(xiàn)消息推送的方法詳解

    這篇文章主要介紹了Android中使用socket通信實(shí)現(xiàn)消息推送的方法,文中舉了一個(gè)消息發(fā)送端和一個(gè)消息接收端以及服務(wù)器端的例子來說明原理并且展示了客戶端的實(shí)現(xiàn),需要的朋友可以參考下
    2016-04-04
  • Android中ListActivity用法實(shí)例分析

    Android中ListActivity用法實(shí)例分析

    這篇文章主要介紹了Android中ListActivity用法,結(jié)合實(shí)例形式較為詳細(xì)的分析了ListActivity功能,注意事項(xiàng)與相關(guān)使用技巧,需要的朋友可以參考下
    2016-02-02
  • Android RecyclerView自由拖動(dòng)item的實(shí)現(xiàn)代碼

    Android RecyclerView自由拖動(dòng)item的實(shí)現(xiàn)代碼

    這篇文章主要介紹了Android RecyclerView自由拖動(dòng)item的實(shí)現(xiàn)代碼,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2024-01-01
  • Android與單片機(jī)通信常用數(shù)據(jù)轉(zhuǎn)換方法總結(jié)

    Android與單片機(jī)通信常用數(shù)據(jù)轉(zhuǎn)換方法總結(jié)

    本文主要介紹Android與單片機(jī)通信常用數(shù)據(jù)轉(zhuǎn)換方法,這里提供了代碼示例,有需要的小伙伴可以參考下
    2016-09-09

最新評(píng)論