用VB能否打开thumbs.db数据库文件,把其中的缩略图显示在VB的图片框里?

SYSSZ 2009-09-03 08:39:05
我最近在研究VB的缩略图显示图片问题,各种方法都试了,但速度和系统缩略图相比太慢了,我以为是XP系统有特殊的、速度极快绘图方法不为我们所知,但是仔细想一想,XP系统也是用GDI+绘图,但我用GDI+绘图就快不起来呢?一直很不解,今天浏览网页,无意中发现这样一段话:
windows xp显示缩略图原理是这样的:首先读取当前目录中的thumbs.db文件,该文件记录了该目录下所有图片的缩略图信息;如果该文件不存在或其中没有该图片的缩略图信息,系统会尝试读取图片的exif信息,看是否存在缩略图信息;如果还是没有,系统将自动生成,并将缩略图信息保存在thumbs.db文件中。 thumbs.db是个隐藏文件.
原来XP系统显示的缩略图并非是当时绘的,而是早就存在于thumbs.db数据库文件中,这就是它快的密诀。thumbs.db我原以为是ACDSee的文件,原来是这种东东!

我的问题是:用VB能否打开thumbs.db数据库文件,把其中的缩略图显示在VB的图片框里。
本人可用分很多,若有人能解决此问题,另外再送200分。
顶贴有分。

...全文
659 30 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
30 条回复
切换为时间正序
请发表友善的回复…
发表回复
a1096448857 2012-09-24
  • 打赏
  • 举报
回复
来看看。。。
huangshuo1024 2010-05-10
  • 打赏
  • 举报
回复
正在为图片缩略图苦恼心伤。百度了一下,看见你的帖子。哎……
对VB6.0心生恐惧。
而且看了很多gdi+,看不懂!
SYSSZ 2009-09-05
  • 打赏
  • 举报
回复
没人回这个贴了?大家都不知道如何弄?我有点想结贴了.
SYSSZ 2009-09-05
  • 打赏
  • 举报
回复
自己顶一下!
toury 2009-09-05
  • 打赏
  • 举报
回复
第一步成功:

Dim conn As New ADODB.Connection
Dim path$
path = App.path & "\" 'path 是文件夹,Thumbs.db是文件名。表名是Thumbs

Call SetAttr(path, vbNormal)
connstr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & path & ";Extended Properties=Paradox 5.x;Persist Security Info=False"
conn.Open connstr
Debug.Print conn.State'成功

Dim rs As New Recordset
rs.Open "SELECT * FROM Thumbs", conn, 1, 1'失败。。。
Debug.Print rs.EOF

toury 2009-09-05
  • 打赏
  • 举报
回复
用这个数据库连接字符串试试:
"Provider=Microsoft.Jet.OLEDB.4.0;Data Source='" & path & "';Extended Properties=Paradox 5.x;Persist Security Info=False"
toury 2009-09-05
  • 打赏
  • 举报
回复
别沉
dingyanwei 2009-09-04
  • 打赏
  • 举报
回复
先顶顶,再看看
SYSSZ 2009-09-04
  • 打赏
  • 举报
回复
顶贴有分,没错,就是散分.
king06 2009-09-04
  • 打赏
  • 举报
回复
[Quote=引用楼主 syssz 的回复:]
我的问题是:用VB能否打开thumbs.db数据库文件,把其中的缩略图显示在VB的图片框里。
本人可用分很多,若有人能解决此问题,另外再送200分。
顶贴有分。
[/Quote]
帮顶了
心匪石不可转 2009-09-04
  • 打赏
  • 举报
回复
up
chinaboyzyq 2009-09-04
  • 打赏
  • 举报
回复

//找到一个C++的
//Thumbs.db 文件怎么打开

#include <stdlib.h>
#include <stdio.h>

#define NFIELDS 5
#define TRUE 1
#define FALSE 0

/* DBF文件头结构 */
struct dbf_head{
char vers;
unsigned char yy,mm,dd;
unsigned int no_recs;
unsigned short head_len,rec_len;
char reserved[20];
};

/* DBF字段描述结构 */
struct field_element{
char field_name[11];
char field_type;
unsigned int offset;
unsigned char field_length;
unsigned char field_decimal;
char reserved1[2];
char dbaseiv_id;
char reserved2[10];
char production_index;
};

char *dbf_fields_name[NFIELDS]={
"a", "b","c","d","e"
};

/* 全局变量 */
struct dbf_head file_head;
struct field_element *fields;
int *length;
unsigned int *offset;

/* 整形数字节顺序改变函数 */
void revert_unsigned_short(unsigned short *a)
{
unsigned short left,right;
left=right=*a;
*a=((left&0x00ff)<<8)|((right&0xff00)>>8);
}

void revert_unsigned_int(unsigned int *a)
{
unsigned int first,second,third,forth;
first=second=third=forth=*a;
*a=((first&0x000000ff)<<24)|((second&0x0000ff00)<<8)|
((third&0x00ff0000)>>8)|((forth&0xff000000)>>24);
}

/* 主函数代码 */
void main()
{
register int i,j;
FILE *fp_dat;
char *buffer;
char *allspace;
int fields_count, matched=FALSE;
unsigned int counts;

/* 打开dbf文件 */
if((fp_dat=fopen("a.dbf","rb"))==NULL){
fprintf(stderr,"Cannot open dbf file to read!\n");
exit(1);
}

/* 读取表头纪录 */
fseek(fp_dat,0L,SEEK_SET);
fread((void*)&file_head,sizeof(struct dbf_head),1,fp_dat);
revert_unsigned_int(&file_head.no_recs);
revert_unsigned_short(&file_head.head_len);
revert_unsigned_short(&file_head.rec_len);

/* 计算字段数 */
fields_count=(file_head.head_len-sizeof(struct dbf_head)-1-263)/sizeof(struct field_element);

/* 开辟存储字段子记录的空间 */
if((fields=(struct field_element*)malloc(sizeof(struct field_element)*fields_count))==NULL){
fprintf(stderr,"Cannot allocate memory for fields array !\n");
fclose(fp_dat);
exit(2);
}

/* 开辟存储一条数据记录的空间 */
if((buffer=(char*)malloc(sizeof(char)*file_head.rec_len))==NULL){
fprintf(stderr,"Cannot allocate memory for record buffer!\n");
fclose(fp_dat);
exit(3);
}

/* 开辟一个全为空格的纪录,以便后面做比较 */
if((allspace=(char*)malloc(sizeof(char)*file_head.rec_len))==NULL){
fprintf(stderr,"Cannot allocate memory for all_space record buffer!\n");
fclose(fp_dat);
exit(4);
}
else{
memset((void*)allspace,'\x20',file_head.rec_len-1);
allspace[file_head.rec_len]='\0';
}

/* 读取所有的字段子记录,调整整形数的字节顺序 */
fread((void*)fields,sizeof(struct field_element),fields_count,fp_dat);
for(i=0;i<fields_count;i++)
revert_unsigned_int(&fields[i].offset);

/* 计算各个字段的字节偏移量,第一字节为删除标记 */
fields[0].offset=1;
for(i=1;i<fields_count;i++)
fields[i].offset=fields[i-1].offset+(unsigned short)fields[i-1].field_length;

/* 开辟存储字段长度和偏移量的数组 */
length=(int*)malloc(sizeof(int)*fields_count);
offset=(unsigned int*)malloc(sizeof(unsigned int)*fields_count);
if(length==NULL||offset==NULL){
fprintf(stderr,"Cannot allocate memory for array length or offset.\n");
exit(-1);
}

/* 找到所需字段的偏移量和长度,如果没有相应字段,程序退出 */
for(i=0;i<NFIELDS;i++)
{
for(j=0;j<fields_count;j++)
{
if(strcmp(dbf_fields_name[i],fields[j].field_name)==0)
{
offset[i]=fields[j].offset - 1;
length[i]=fields[j].field_length;
matched=TRUE;
break;
}
if(!matched){
fprintf(stderr,"dbf file structure is invalid, field %s not found.\n", dbf_fields_name[i]);
exit(-1);
}
else
matched=FALSE;
}
}

/* 定位文件指针到数据记录的开始位置 */
fseek(fp_dat,(long)file_head.head_len,SEEK_SET);

/* 读取每条记录的字段数据 */
for(counts=0;counts<file_head.no_recs;counts++)
{
/* 如果有删除标记,跳到下一条记录 */
if(fgetc(fp_dat)==(int)'\x2a')
{
fseek(fp_dat,(int)file_head.rec_len-1,SEEK_CUR);
continue;
}
fread((void*)buffer,(int)file_head.rec_len-1,1,fp_dat);
buffer[file_head.rec_len]='\0';

/*去掉全为空格的记录行*/
if(strcmp(buffer,allspace)==0)
continue;
}

fclose(fp_dat);

/* 释放开辟的空间 */
free(buffer);
free(allspace);
free(offset);
free(length);
//一个c++语言编写的db程序
bluesky396 2009-09-04
  • 打赏
  • 举报
回复
不懂,帮顶。。。貌似这个软件可以查看thumbs.db。。。

http://www.skycn.com/soft/27308.html
m60a1 2009-09-04
  • 打赏
  • 举报
回复
蹭分:)
东方之珠 2009-09-04
  • 打赏
  • 举报
回复
来顶顶,再看看
SYSSZ 2009-09-03
  • 打赏
  • 举报
回复
六楼提供的链接中东东,怎样弄成在VB6.0下也可运行?
chinaboyzyq 2009-09-03
  • 打赏
  • 举报
回复


手机代理上网真的象蜗牛爬一样~~~~~~~~~~~~~~~~~~~
SYSSZ 2009-09-03
  • 打赏
  • 举报
回复
测试遇到困难,我只装了VB net2005,可例子好象是VB net2008写的,打不开说是高版本写的,想把它转成VB6.0代码,困难也不小,谁安装了VB net2008先测试一下.
chinaboyzyq 2009-09-03
  • 打赏
  • 举报
回复
另外我还想知道这是一个什么格式的文件(或说这是哪一种数据库文件)??
SYSSZ 2009-09-03
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 chinaboyzyq 的回复:]
我讨厌控件,没控件不能完成吗?
[/Quote]
同感!你动动脑筋看能否去掉控件?
加载更多回复(10)
vb提取查看thumbs.db文件中的图像内容,VB6.0编写开发的Windows XP缩略图缓存文件查看提取工具,把有图片文件夹中的Thumbs.db拖到下面的列表框中(在资源管理器的文件夹选项设置中要取消“隐藏受保护的系统文件(推荐)”,才可以看到XP的缓存缩略图文件Thumbs.db)。   实现原理部分需要说明的是:PSC原作者使用String类型来读取,这可能是英文操作系统上可以运行,但是在中文操作系统是错误的,在用 Preserve 关键字时,只能改变多维数组中最后一维的上界;所以,第1维存放数据,范围就是0(缩略图Jpg大小最大不会超过5KB),第2维根据项目的个数来表示的编号但是不能直接使用数组的形式来返回,必须用传址的方式返回   还有一种方法,是记录每个图片文件项目的差异的偏移,及插入的非jpg数据块的大校   因为没有Thumbs.db的详细文件格式资料,无法获取文件的个数现在这个版本有一个问题,会有些文件看不到,因为查看文件内容发现,中间有些Jpg文件很短,只有几百字节,与文件数据前的文件大小不符合,这样就会跳过一个文件,导致漏掉文件。   增加一个判断,每找到一个标志,跳过文件长度时,先判断该长度的文件尾是不是Jpg的文件尾标志,如果不是则从之前的位置继续搜索。一种情况:就是4位字节文件大小的值,小于实际的文件大小值,这就需要搜索修正在Thumbs.db文件里找到了全部对应文件文件名,是用Unicode字符存储在里面的,有的是单独的一个,有的是几个连续一起。
VB 做的相册(缩略图预览程序) VB做的小型相册,实际上是一个图片浏览程序,打开显示缩略图,鼠标点击显示图片,并可接着浏览下去,程序相关说明:   函数功能: 该函数将指定位图的位拷贝到缓冲区里?   函数原型:LONG GetBitmapBits(HBITMAP hbmp, LONG cbBuffer, LPVOID lpvBits);   参数:   hbmp:指向感兴趣的位图的句柄?   cbBuffer:指定要从位图拷贝到缓冲区的字节数?   lpvBits:指向接收位图位数据的缓冲区指针?这些位是按字节类型存储在数组中的?   返回值:如果该函数执行成功,那么返回值就是拷贝到缓冲区的字节数;如果该函数执行失败,那么返回值为0。   Declare Function GetBitmapBits Lib "gdi32" (ByVal hBitmap As Long, ByVal nwCount As Long, lpBits As Any) As Long      函数功能:该函数将位图的颜色数据位设置成指定值?   函数原型:LONG SetBitmapBits(HBITMAP hmbp, DWORD cBytes, CONST VOID (lpBits);   参数:   hbmp:指向要设置的位图的句柄?   cBytes:指定参数lpBits指向的数组的字节数?   lpBits:指向字节类型数组的指针?该数组中包含了指定位图的颜色数据?   返回值:如果该函数执行成功,则返回值就是在设置位图位时使用的字节数;如果失败,则返回值为0。      函数功能:该函数得到指定图形对象的信息,根据图形对象,函数把填满的或结构,或表项(用于逻辑调色板)数目放入一个指定的缓冲区。   函数原型:int GetObject(HGDIOBJ hgdiobj, int cbBuffer, LPVOID lpvObject);   参数:   hgdiobj:指向感兴趣的图形对象的句柄,它可以是这样的一个句柄:一个逻辑位图、一个刷子、一种字体、一个调色板、笔或通过调用CreateDIBsection函数创建的与设备无关位图。   cbBuffer:指定将要写到缓冲区的信息的字节数目?‘lpvObject:指向一个缓冲区的指针,该缓冲区将要检索指定图形对象的信息。      函数功能描述:将一块内存的数据从一个位置复制到另一个位置   函数原型:VOID CopyMemory(PVOID Destination,CONST VOID *Source,DWORD Length);   参数:   Destination:要复制内存块的目的地址?   Source:要复制内存块的源地址?   Length:指定要复制内存块的大小,单位为字节   返回值:该函数为VOID型,没有返回值。

808

社区成员

发帖
与我相关
我的任务
社区描述
VB 多媒体
社区管理员
  • 多媒体
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧