泛型,存放N张图片

(* *************************************************
	1、里面放多张图片,用文件名作为索引
	2、线程在背后从硬盘加载到内存
	3、批量加载
	4、加载完成后执行回调,回调是线程安全的
	5、回调中的参数是新加载了多少张图片
************************************************** *)
unit BitmapList;

interface

uses
  ystem.SysUtils, System.Classes, FMX.Graphics, Generics.Collections,
  xSuperObject, xSuperJson, UrlMon, IdURI, DateUtils;

type
  TBitmapList = class(TDictionary<string, TBitmap>)
  private

  public
	RPath, LPath: string; // url路径,本地路径
	function CreateDirPath(url: string): string; // 生成路径
	function GetSubDateTime(S1, S2: string): string; // 获取两个时间间隔
	procedure LoadFromFiles(s: string; callback: TProc < Integer >= nil);	overload; // 加载一个或逗号分隔的多个图片文件名
	procedure LoadFromFiles(ss: TStrings; callback: TProc < Integer >= nil);overload; // TStrings    的多个图片文件名
	procedure LoadFromFiles(ja: ISuperArray; callback: TProc < Integer >= nil);	overload; // jo          的多个图片文件名
	procedure LoadFromFiles(ja: ISuperArray; k: string; callback: TProc < Integer >= nil); overload;	// ja.O[i].S[K]的多个图片文件名  ja里的某个值
end;
implementation
uses UnitLog;
{ TBitmapList }
procedure TBitmapList.LoadFromFiles(s: string; callback: TProc<Integer>);
var
  temp1, temp2: string;
  i, j: Integer;
begin
  TThread.CreateAnonymousThread(
    procedure
    var
    	i, n: Integer;
	t, t1: string;
	o: TBitmap;
	a: TArray<string>;
	begin
	  n := 0;
	  a := s.Split([‘,‘]);
       for i := 0 to length(a) - 1 do
	  begin
		t := a[i];
		if (t <> ‘‘) and (not ContainsKey(t)) then
		begin
		  if (not FileExists(t)) and (RPath <> ‘‘) then
		  begin
			t1 := t.Replace(RPath, LPath).Replace(‘/‘, ‘\‘); // 本地路径
			if (UrlDownloadToFile(nil, PChar(TIdURI.URLEncode(t)), PChar(t1), 0, nil) = 0) then
			t := t1
       	   else
			t := ‘‘;
		  end;
			if (t <> ‘‘) and (ContainsKey(t) = False) then
			begin
			  o := TBitmap.Create;
			  o.LoadFromFile(t);
			  Add(t, o);
			  Inc(n);
			end;
		end;
	end;

	if (Assigned(callback)) then
      	TThread.Synchronize(TThread.CurrentThread,
		procedure
		begin
		callback(n);
					end);
		end).Start;
end;

procedure TBitmapList.LoadFromFiles(ss: TStrings; callback: TProc<Integer>);
var
	s: string;
	i: Integer;
begin
	for i := 0 to ss.Count - 1 do
	begin
		s := ss[i];
		LoadFromFiles(s, callback);
	end;
end;

procedure TBitmapList.LoadFromFiles(ja: ISuperArray; k: string;
callback: TProc<Integer>);
var
	s: String;
	x: IMember;
	i: Integer;
begin
	s := ‘‘;
	for x in ja do
		s := s + x.AsObject.s[k] + ‘,‘;
	s := s.TrimRight([‘,‘]);
	LoadFromFiles(s, callback);
end;

procedure TBitmapList.LoadFromFiles(ja: ISuperArray; callback: TProc<Integer>);
var
	s: string;
	x: IMember;
begin
	s := ‘‘;
	for x in ja do
		s := x.AsString;
	LoadFromFiles(s, callback);
end;
时间: 2024-10-22 23:59:02

泛型,存放N张图片的相关文章

Android Bitmap 加载多张图片的缓存处理(精华二)

一般少量图片是很少出现OOM异常的,除非单张图片过~大~ 那么就可以用教程一里面的方法了通常应用场景是listview列表加载多张图片,为了提高效率一般要缓存一部分图片,这样方便再次查看时能快速显示~不用重新下载图片但是手机内存是很有限的~当缓存的图片越来越多,即使单张图片不是很大,不过数量太多时仍然会出现OOM的情况了~本篇则是讨论多张图片的处理问题 -----------------------------------------------------------------------

Android Bitmap 全面解析(二)加载多张图片的缓存处理

一般少量图片是很少出现OOM异常的,除非单张图片过~大~ 那么就可以用教程一里面的方法了通常应用场景是listview列表加载多张图片,为了提高效率一般要缓存一部分图片,这样方便再次查看时能快速显示~不用重新下载图片但是手机内存是很有限的~当缓存的图片越来越多,即使单张图片不是很大,不过数量太多时仍然会出现OOM的情况了~本篇则是讨论多张图片的处理问题-----------------------------------------------------------------------图片

Android Retrofit 实现(图文上传)文字(参数)和多张图片一起上传

背景 在有心课堂<自己动手写HTTP框架>课程中有下列课程: 自拍要发朋友圈如何实现 http://stay4it.com/course/4/learn#lesson/208 通过自己写的HTTP框架实现将图片和文字等内容在一个接口中提交到服务器.无论哪种网络框架,都要遵守HTTP协议.下面我们简单了解下HTTP协议. HTTP协议 其中HTTP协议版本有两种:HTTP1.0/HTTP1.1 可以这样区别: HTTP1.0对于每个连接都的建立一次连接一次只能传送一个请求和响应,请求就会关闭,H

Caffe2——cifar10数据集创建lmdb或leveldb类型的数据

Caffe2——cifar10数据集创建lmdb或leveldb类型的数据 cifar10数据集和mnist数据集存储方式不同,cifar10数据集把标签和图像数据以bin文件的方式存放在同一个文件内,这种存放方式使得每个子cifar数据bin文件的结构相同,所以cifar转换数据代码比mnist的代码更加的模块化,分为源数据读取模块(image_read函数),把lmdb(leveldb)数据转换的变量声明,句柄(函数)调用都放到定义的caffe::db子空间中,这样简化了代码,而且使得代码更

Windows Store App JavaScript 开发:简单对象绑定

简单对象绑定是一种基本的绑定类型,可以实现将一个对象中的数据绑定到HTML元素的属性.下面通过一个示例来演示如何使用HTML5和JavaScript开发一个实现简单对象绑定的Windows应用商店应用程序.在这个应用程序中将一个img控件与一个包含图片路径信息的对象相绑定,实现在img控件中显示图片. 在Visual Studio 2012中新建一个JavaScript的Windows应用商店的空白应用程序项目,将其命名为SimpleObjectBinding.接着添加项目中用到的图片文件,在项

轻量级数据库sqlite的接口说明

原文地址:http://www.cnblogs.com/kfqcome/archive/2011/06/27/2136999.html 一.使用流程 要使用sqlite,需要从sqlite官网下载到三个文件,分别为sqlite3.lib,sqlite3.dll,sqlite3.h,然后再在自己的工程中配置好头文件和库文件,同时将dll文件放到当前目录下,就完成配置可以使用sqlite了. 使用的过程根据使用的函数大致分为如下几个过程: sqlite3_open() sqlite3_prepare

SQLite剖析之编程接口详解

前言 使用过程根据函数大致分为如下几个过程: sqlite3_open() sqlite3_prepare() sqlite3_step() sqlite3_column() sqlite3_finalize() sqlite3_close() 这几个过程是概念上的说法,而不完全是程序运行的过程,如sqlite3_column()表示的是对查询获得一行里面的数据的列的各个操作统称,实际上在sqlite中并不存在这个函数. 1.sqlite3_open() 该函数用来打开数据库.在操作数据库之前,

centos7 上nginx php环境的搭建

第一步:修改nginx.conf的配置,以nginx.conf.default为参考. #修改nginx运行账号为:nginx组的nginx用户user nginx nginx; 将nginx.conf.default中的 1 和2两个部分复制到nginx.conf中,注意在1中增加index.php,将2中的#得去掉,还的将fastcgi_param行的参数,改为$document_root$fastcgi_script_name,或者使用绝对路径. 第二步:修改php-fpm.conf vi

可点击的焦点图

<!DOCTYPE html><html> <head> <meta charset="utf-8"> <title>滑动的焦点图</title> <script src="WebUI/js/jquery-1.4.1.min.js" type="text/javascript" charset="utf-8"></script> /