第二百二十四回 如何加载本地图片

本文介绍了在Flutter中加载本地图片的步骤,包括使用Image.file()方法、处理加载过程和错误的frameBuilder和errorBuilder属性,以及通过getExternalStorageDirectory获取图片路径。


我们在上一章回中介绍了"如何加载网络图片"相关的内容,本章回中将介绍 如何加载本地图片.闲话休提,让我们一起Talk Flutter吧。

在这里插入图片描述

1. 概念介绍

我们在上一章回中介绍的内容与图片有关,本章回中仍然介绍图片相关的知识:加载本地图片。我们在这里说的本地图片表示图片存储于手机自带的文件系统中,我们可以通过AndroidStudioDeviceFileManger中看到图片。

2. 实现方法

2.1 主要步骤

加载本地图片的主要是步骤是使用file()方法,它是image类的静态方法,可以直接拿来使用。该方法提供了一些常用的属性,详细如下:

  • color属性:主要用来修改图片的颜色;
  • frameBuilder属性: 主要用来控制图片从本地加载过程中显示的内容;
  • errorBuilder属性: 主要用来控制图片从本地加载失败后显示的内容;

该方法还有一个没有命名的属性:file,该属性主要用来存放图片的绝对地址,这个是必不可少的内容。

2.2 注意事项

在加载本地图片时需要处理加载过程和加载错误,加载错误时通过errorBuilder属性控制,该属性是方法类型,它会把错误的信息通过方法的参数传递出来,我们可以依据错误信息做相关的处理。

加载过程中通过frameBuilder属性控制,该属性也是方法类型,它会把加载的帧数和加载完后的图片通过参数传递出来,我们可以显示图片加载的帧数。稍后我们将通完示例代码来演示。

3. 示例代码

///对应目录:storage/emulated/0/Android/data/package_name/files
Future<Directory?>? _externalDocumentsDirectory;
String filePath = "";
  _externalDocumentsDirectory = getExternalStorageDirectory();

  _externalDocumentsDirectory?.then((value) {
    debugPrint("current path: ${value?.path} ");
    setState(() {
      filePath = "${value?.path}/switch.png";
    });
  });

Image.file(
  File(filePath),
  width: 200,
  height: 200,
  alignment: Alignment.center,
  fit: BoxFit.fill,
  ///处理文件导入正确相关的内容
  frameBuilder:(context,child,frame,wasSynchronouslyLoaded) {
    if(wasSynchronouslyLoaded) {
      return child;
    }else {
      // return Text("frame:${frame.toString()}");
      return child;
    }
  },
  ///处理文件导入错误相关的内容
  errorBuilder: (context,error,trace) {
    debugPrint("load file error: ${error.toString()}");
    return Text(error.toString());
  },
),

上面的示例代码中演示了如何使用Image的file()方法加载本地图片,同时处理了图片加载过程和加载错误的业务逻辑,不过我们处理的的比较简单,只是显示一个加载中或者加载错误的文字信息。大家可以依据自身业务逻辑进行相关的处理。

此外,代码中处理图片加载中的业务时可以判断帧数,通常加载完第一帧时就会返回图片信息,不过这个帧数与图片自身有关,有些图片只有一帧,有些图片包含多帧。因此这个frameBuilder属性与具体的图片有关,可以不去处理它。

代码中使用了getExternalStorageDirectory()方法,该方法是path_provider包提供的接口,它可以获取到当前存储的绝对位置,具体的位置信息可以参考我们在代码中的文字注释。我们提前在该位置所在的目录中存放了一个名叫switch.png的图片,运行程序程序可以看到该图片,大家可以替换成自己文件系统中的图片文件,或者不放图片文件,此时会显示错误信息。

4. 内容总结

最后,我们对本章回的内容做一个全面的总结:

  • 加载本地图片使用Image组件的file()方法;
  • 加载图片时需要处理图片加载过程和加载错误的业务逻辑;
  • 加载过程的属性与图片有关,可以依据实际业务来处理,或者不处理;

看官们,与"如何加载本地图片"相关的内容就介绍到这里,欢迎大家在评论区交流与讨论!

内容概要:本文介绍了一个基于Matlab的综合能源系统优化调度仿真资源,重点实现了含光热电站、有机朗肯循环(ORC)和电含光热电站、有机有机朗肯循环、P2G的综合能源优化调度(Matlab代码实现)转气(P2G)技术的冷、热、电多能互补系统的优化调度模型。该模型充分考虑多种能源形式的协同转换与利用,通过Matlab代码构建系统架构、设定约束条件并求解优化目标,旨在提升综合能源系统的运行效率与经济性,同时兼顾灵活性供需不确定性下的储能优化配置问题。文中还提到了相关仿真技术支持,如YALMIP工具包的应用,适用于复杂能源系统的建模与求解。; 适合人群:具备一定Matlab编程基础和能源系统背景知识的科研人员、研究生及工程技术人员,尤其适合从事综合能源系统、可再生能源利用、电力系统优化等方向的研究者。; 使用场景及目标:①研究含光热、ORC和P2G的多能系统协调调度机制;②开展考虑不确定性的储能优化配置与经济调度仿真;③学习Matlab在能源系统优化中的建模与求解方法,复现高水平论文(如EI期刊)中的算法案例。; 阅读建议:建议读者结合文档提供的网盘资源,下载完整代码和案例文件,按照目录顺序逐步学习,重点关注模型构建逻辑、约束设置与求解器调用方式,并通过修改参数进行仿真实验,加深对综合能源系统优化调度的理解。
好的,我可以帮你提供一些基于TensorFlow 2.x下的VGG13实现的代码,以及相关的test和draw文件。同时,我也会给你一些加载本地船舶图片的代码示例。请注意,这份代码仅供参考,你需要根据自己的实际情况进行修改和调整。 首先,我们需要安装TensorFlow 2.x和相关的依赖库,可以通过以下命令进行安装: ``` pip install tensorflow pip install matplotlib pip install numpy ``` 然后,我们来看一下基于VGG13的图片分类模型的实现代码。代码如下: ```python import tensorflow as tf from tensorflow.keras.layers import Input, Conv2D, MaxPooling2D, Flatten, Dense, Dropout from tensorflow.keras.models import Model def VGG13(input_shape=(224, 224, 3), num_classes=2): # 定义输入层 input_layer = Input(shape=input_shape) # 第一段卷积层 x = Conv2D(64, (3, 3), activation='relu', padding='same', name='block1_conv1')(input_layer) x = Conv2D(64, (3, 3), activation='relu', padding='same', name='block1_conv2')(x) x = MaxPooling2D((2, 2), strides=(2, 2), name='block1_pool')(x) # 第二段卷积层 x = Conv2D(128, (3, 3), activation='relu', padding='same', name='block2_conv1')(x) x = Conv2D(128, (3, 3), activation='relu', padding='same', name='block2_conv2')(x) x = MaxPooling2D((2, 2), strides=(2, 2), name='block2_pool')(x) # 第三段卷积层 x = Conv2D(256, (3, 3), activation='relu', padding='same', name='block3_conv1')(x) x = Conv2D(256, (3, 3), activation='relu', padding='same', name='block3_conv2')(x) x = Conv2D(256, (3, 3), activation='relu', padding='same', name='block3_conv3')(x) x = MaxPooling2D((2, 2), strides=(2, 2), name='block3_pool')(x) # 第四段卷积层 x = Conv2D(512, (3, 3), activation='relu', padding='same', name='block4_conv1')(x) x = Conv2D(512, (3, 3), activation='relu', padding='same', name='block4_conv2')(x) x = Conv2D(512, (3, 3), activation='relu', padding='same', name='block4_conv3')(x) x = MaxPooling2D((2, 2), strides=(2, 2), name='block4_pool')(x) # 第五段卷积层 x = Conv2D(512, (3, 3), activation='relu', padding='same', name='block5_conv1')(x) x = Conv2D(512, (3, 3), activation='relu', padding='same', name='block5_conv2')(x) x = Conv2D(512, (3, 3), activation='relu', padding='same', name='block5_conv3')(x) x = MaxPooling2D((2, 2), strides=(2, 2), name='block5_pool')(x) # 全连接层 x = Flatten()(x) x = Dense(4096, activation='relu', name='fc1')(x) x = Dropout(0.5)(x) x = Dense(4096, activation='relu', name='fc2')(x) x = Dropout(0.5)(x) output_layer = Dense(num_classes, activation='softmax', name='output')(x) # 定义模型 model = Model(inputs=input_layer, outputs=output_layer, name='vgg13') # 打印模型结构 model.summary() return model ``` 接下来,我们来看一下测试代码。测试代码需要读入测试数据集,然后对测试集进行预测并计算准确率等评价指标。代码如下: ```python import os import numpy as np import tensorflow as tf from tensorflow.keras.preprocessing.image import ImageDataGenerator from sklearn.metrics import classification_report # 加载测试数据集 test_dir = './test_data' test_datagen = ImageDataGenerator(rescale=1./255) test_generator = test_datagen.flow_from_directory( test_dir, target_size=(224, 224), batch_size=32, class_mode='binary') # 加载模型 model = tf.keras.models.load_model('./vgg13.h5') # 对测试集进行预测 y_pred = model.predict(test_generator) y_pred = np.argmax(y_pred, axis=1) # 计算评价指标 target_names = ['class 0', 'class 1'] print(classification_report(test_generator.classes, y_pred, target_names=target_names)) ``` 最后,我们来看一下绘制损失函数随epoch的变化曲线的代码。代码如下: ```python import matplotlib.pyplot as plt import numpy as np # 加载训练日志文件 log_file = './training.log' with open(log_file, 'r') as f: lines = f.readlines() # 解析训练日志文件 epochs = [] losses = [] val_losses = [] for line in lines: if line.startswith('Epoch'): epoch = int(line.split()[1]) epochs.append(epoch) elif line.startswith('loss:'): loss = float(line.split()[1]) val_loss = float(line.split()[3]) losses.append(loss) val_losses.append(val_loss) # 绘制损失函数随epoch的变化曲线 plt.plot(epochs, losses, 'r', label='Training Loss') plt.plot(epochs, val_losses, 'b', label='Validation Loss') plt.title('Training and Validation Loss') plt.xlabel('Epoch') plt.ylabel('Loss') plt.legend() plt.show() ``` 至于如何将本地的船舶图片加载到代码中,你可以使用TensorFlow提供的ImageDataGenerator类来读取本地图片,具体代码如下: ```python from tensorflow.keras.preprocessing.image import ImageDataGenerator # 加载本地船舶图片 data_dir = './ship_data' batch_size = 32 train_datagen = ImageDataGenerator( rescale=1./255, shear_range=0.2, zoom_range=0.2, horizontal_flip=True) train_generator = train_datagen.flow_from_directory( data_dir+'/train', target_size=(224, 224), batch_size=batch_size, class_mode='binary') val_datagen = ImageDataGenerator(rescale=1./255) val_generator = val_datagen.flow_from_directory( data_dir+'/val', target_size=(224, 224), batch_size=batch_size, class_mode='binary') ``` 希望这份代码能够帮助到你,祝你在船舶图像二分类任务中取得好成绩!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

talk_8

真诚赞赏,手有余香

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值