日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

ios 从assets加载图片_Flutter图片添加水印功能,Flutter保存Widget为图片

發(fā)布時間:2025/3/20 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ios 从assets加载图片_Flutter图片添加水印功能,Flutter保存Widget为图片 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

添加水印,兩種實現(xiàn)思路,一種是將圖片與水印解碼,然后混編再編碼,另一種是通過Widget的方式合成。

在這里采用的實現(xiàn)思路是使用層疊布局Stack加載圖片以及水印部分,水印部分可能是一個現(xiàn)成的圖片也可能是一個文字等其他樣式的組件,然后將這個Stack使用RepaintBoundary組件包裹起來,然后通過Widget生成圖片的功能從而達(dá)到實現(xiàn)保存圖片為水印效果。

如圖下圖所示,加載的本地資源目錄下的一張圖片,點擊右上角的對勾然后將圖片與右下角的文字合面一起生成一張新圖片保存在手機目錄存儲中。


然后在Android Studio控制臺中輸入的日志如下:

flutter:?保存的圖片地址為/Users/androidlongs/Library/Developer/CoreSimulator/Devices/DD736D17-AB7D-47CA-81C5-2D5283944F6B/data/Containers/Data/Application/AE08A4F2-9DFE-4A23-80A7-7BEB153A30B0/Documents/723.png

因為這里使用的是 ios 模擬器,所以這里保存在了模擬器使用的內(nèi)存空間中,打開保存的路徑查看

從保存到的圖片中可以看到水印已經(jīng)添加上去了

在這里將顯示將上述所有顯示與操作的UI功能封裝在一個StatefulWidget,在這里可以使用一種新的方式打開這個頁面,當(dāng)顯示的圖片沒有填充屏幕時,四周會是暗色半透明效果,也就是打開的Widet頁面背景透明,代碼如下:

///背景透明的跳轉(zhuǎn)Navigator.of(context) .push(PageRouteBuilder( opaque: false, pageBuilder: (context, animation, secondaryAnimation) { return ImageWatermarkPage(); })) .then((value) { if(value!=null){ /// print("保存的圖片地址為$value");??????}

對于頁面ImageWatermarkPage就是實現(xiàn)了顯示圖片以及水印展示功能,代碼如下:

class ImageWatermarkPage extends StatefulWidget { @override _RawImageState createState() => _RawImageState();}class _RawImageState extends State<ImageWatermarkPage> { ///生成圖像的層疊布局Stack的主鍵 GlobalKey _globalKey = GlobalKey(); ///正在保存中 bool isSaving = false; @override Widget build(BuildContext context) { return Scaffold( ///頁面背景為半透明的灰色 backgroundColor: Color(0x50cdcdcd), ///填充布局 body:Stack( ///約束未設(shè)置位置的子Widget劇中對齊 alignment: Alignment.center, children: [ ///生成目標(biāo)圖像的圖片與水印部分 buildWaterImageWidget(), ///保存水印圖片的操作部分 buildSaveWidget(), ///取消操作的部分 buildCancleWidget(), ///正在保存圖像時顯示的進(jìn)度 buildLoadingWidget(), ], ), ); } ... 省略}

生成目標(biāo)圖像的圖片與水印部分封裝在buildWaterImageWidget方法中,在這里就是通過RepaintBoundary組件將圖片與水印部分通過層疊布局結(jié)合在一起的UI構(gòu)建,代碼如下:

///生成目標(biāo)圖像的圖片與水印部分 Widget buildWaterImageWidget() { ///可以為其子元素創(chuàng)建一個單獨的子樹 ///相當(dāng)于總樹Widgets上的一個小分叉樹枝 return RepaintBoundary( key: _globalKey, ///用于生成圖像的Widget child: Container( ///全屏顯示 width: MediaQuery.of(context).size.width, height: MediaQuery.of(context).size.height, child: Stack( children: [ Image.asset( "assets/images/2.0x/s03.jpeg", fit: BoxFit.fill, width: MediaQuery.of(context).size.width, height: MediaQuery.of(context).size.height, ), ///右下角的水印部分 Positioned( bottom: 20,right: 20, child: Container( padding: EdgeInsets.only(left: 8,right: 8,top: 2,bottom: 2), decoration: BoxDecoration(border: Border.all( color: Colors.red, width: 1.0 )), child: Text("這里是水印",style: TextStyle(fontSize: 14,color: Colors.white),), ), ) ], ), ), );??}

對于方法buildSaveWidget就是封裝了構(gòu)建保存對勾以及功能的方法,代碼如下

///保存水印圖片的操作部分 Widget buildSaveWidget() { ///小對勾按鈕顯示在右上角 return Positioned( top: 40, right: 20, child: IconButton( icon: Icon(Icons.check_circle,color: Colors.blue,size: 33,), onPressed: () async { ///更新頁面顯示 setState(() { isSaving = true; }); ///通過globalkey將Widget保存為ui.Image ui.Image _image = await ImageLoaderUtils.imageLoader .getImageFromWidget(_globalKey); ///異步將這張圖片保存在手機內(nèi)部存儲目錄下 String localImagePath = await ImageUtils.imageUtils .saveImageByUIImage(_image, isEncode: false); ///保存完畢后關(guān)閉當(dāng)前頁面并將保存的圖片路徑返回到上一個頁面 Navigator.of(context).pop(localImagePath); }, ), );??}取消操作的部分就是頁面左上角的關(guān)閉按鈕,功能比較簡單在buildCancleWidget方法中構(gòu)建,代碼如下: ///取消操作的部分 Widget buildCancleWidget() { return Positioned( top: 40, left: 20, child: IconButton( icon: Icon(Icons.clear,color: Colors.red,size: 33,), onPressed: () { Navigator.of(context).pop(); }, ), ); }

buildLoadingWidget方法中封裝了當(dāng)用戶點擊保存時,更新 isSaving的值為true,然后在頁面上顯示一個小圓圈,以給用戶一個正在操作中的提示反饋,代碼如下:

///正在保存圖像時顯示的進(jìn)度 ///一個小圓圈 Widget buildLoadingWidget() { return isSaving?CircularProgressIndicator():Container(); }

在這里將Widget保存為圖像的方法ImageLoaderUtils的getImageFromWidget方法以及將Image保存到手機存儲中的方法saveImageByUIImage 會在下一篇文章中分享。

總結(jié)

以上是生活随笔為你收集整理的ios 从assets加载图片_Flutter图片添加水印功能,Flutter保存Widget为图片的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 欧美激情aaa | 性的免费视频 | 欧美久久一区二区三区 | 国产日韩欧美专区 | 伊人久久精品 | 亚洲一区二区免费视频 | 免费在线观看黄视频 | 91香蕉视频在线观看免费 | 免费黄网站在线观看 | 欧美日韩性生活 | 亚洲一区二区电影网 | 深夜视频在线观看免费 | 中国zzji女人高潮免费 | 精品国产乱码久久久久久1区二区 | 国产精品4区 | 中文字幕亚洲乱码熟女一区二区 | 中文字幕在线2021 | 亚洲草逼视频 | 熟妇高潮一区二区 | av在线你懂的| 岛国av网址 | 久久久久久穴 | 五月天激情影院 | 98精品国产| 无码日韩精品视频 | 看一级大片| 337p粉嫩大胆噜噜噜亚瑟影院 | 黄色片免费的 | 爱搞逼综合| 波多野结衣黄色网址 | av免费在线网站 | 911国产视频 | 97久久人国产精品婷婷 | 99热热99| 青青草原综合久久大伊人精品 | 免费又黄又爽又色的视频 | 国产一区不卡视频 | 日本欧美国产在线 | 久久123| 绯色av一区二区 | 免费a级片视频 | 亚洲精品一卡 | 国产又粗又猛又爽又黄av | 久久久国产精品久久久 | 日韩一区二区在线观看视频 | 国产噜噜噜噜久久久久久久久 | 欧洲精品久久久久毛片完整版 | 欧美日韩另类在线 | 激情文学欧美 | 伊人青青 | 51啪影院 | 欧美高清视频一区二区三区 | 亚洲精久久 | 亚洲偷怕 | 亚洲av熟女国产一区二区性色 | 女性裸体无遮挡胸 | 狠狠干男人的天堂 | 亚洲视频欧洲视频 | 18无码粉嫩小泬无套在线观看 | 国产亚洲美女精品久久久2020 | 91精品91久久久中77777老牛 | 欧美特一级片 | 精产国品一区二区三区 | 亚洲精品国偷拍自产在线观看蜜桃 | 日韩一区二区三区在线免费观看 | 中国白嫩丰满人妻videos | 玖玖视频在线 | 黄色网址链接 | 日韩精品视频播放 | 免费激情小视频 | 人人射视频 | 狠狠操欧美 | 国产3p精品一区 | 日韩精品视频免费看 | 精品在线视频免费 | 黄色综合| 日本一区二区视频在线 | 国产极品美女在线 | 亚洲午夜福利一区二区三区 | 欧美日韩另类一区 | 欧美撒尿777hd撒尿 | 国产精品815.cc红桃 | 伊人久久五月 | 亚洲情人网 | 一级性生活黄色片 | 后进极品白嫩翘臀在线视频 | 国产成人无码a区在线观看视频 | 美女福利视频导航 | 亚洲福利影院 | 一区二区三区在线免费 | 97高清国语自产拍 | 茄子av| 一级黄色片在线观看 | 国产精品久久久久久久久久 | 992tv成人免费视频 | 成人日韩视频 | 欧美精品第一区 | 男男一级淫片免费播放 | 少妇av网 |