如何在vc中实现jpeg文件的显示和exif的读取

如何在vc中实现jpeg文件的显示和exif的读取,第1张

在显示图像之前,首先要获取到图像文件的存放路径,这里采用标准的文件打开对话框来选取图像文件,文件名存放在CString 型的变量m_sPath中:

CFileDialog dlg(TRUE,"jpg","jpg",

OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,

"JPEG文件(jpg)|jpg|GIF文件(gif)|gif||",NULL);

if(dlgDoModal()==IDOK)

{

m_sPath=dlgGetPathName();

Invalidate();

}

为简单计,图形显示的代码直接在视类中的OnDraw中编写,首先打开文件并判断文件的可用性,并把文件内容放到流接口IStream的对象pStm中:

IStream pStm;

CFileStatus fstatus;

CFile file;

LONG cb;

……

if (fileOpen(m_Path,CFile::modeRead)&&fileGetStatus(m_Path,fstatus)&& ((cb = fstatusm_size) != -1))

{

HGLOBAL hGlobal = GlobalAlloc(GMEM_MOVEABLE, cb);

LPVOID pvData = NULL;

if (hGlobal != NULL)

{

if ((pvData = GlobalLock(hGlobal)) != NULL)

{

fileReadHuge(pvData, cb);

GlobalUnlock(hGlobal);

CreateStreamOnHGlobal(hGlobal, TRUE, &pStm);

}

}

}

然后,就直接调用OleLoadPicture函数从流中装载图像:

IPicture pPic;

……

OleLoadPicture(pStm,fstatusm_size,TRUE,IID_IPicture,(LPVOID)&pPic));

由于该函数有时会导致失败,所以应当用SUCCEEDED宏来做一些适当的保护工作,只有在数据装载成功的前提下才能继续下面的图像显示工作:

if(SUCCEEDED(OleLoadPicture(pStm,fstatusm_size,TRUE,IID_IPicture,(LPVOID)&pPic)))

{

OLE_XSIZE_HIMETRIC hmWidth;

OLE_YSIZE_HIMETRIC hmHeight;

pPic->get_Width(&hmWidth);

pPic->get_Height(&hmHeight);

double fX,fY;

……

fX = (double)pDC->GetDeviceCaps(HORZRES)(double)hmWidth/((double)pDC->GetDeviceCaps(HORZSIZE)1000);

fY = (double)pDC->GetDeviceCaps(VERTRES)(double)hmHeight/((double)pDC->GetDeviceCaps(VERTSIZE)1000);

if(FAILED(pPic->Render(pDC,0,0,(DWORD)fX,(DWORD)fY,0,hmHeight,hmWidth,-hmHeight,NULL))) {

AfxMessageBox("渲染图像失败!");

pPic->Release();

}

else

AfxMessageBox("从流中装载图像失败!");

}

其中,显示工作主要是由IPicture接口对象的Render函数来完成的,该函数主要用来将的指定部分画到指定的设备环境的指定位置。原型如下:

HRESULT Render( HDC hdc, //渲染图像用的设备环境句柄

long x, //在hdc上的水平坐标

long y, //在hdc上的垂直坐标

long cx, //图像宽度

long cy, //图像高度

OLE_XPOS_HIMETRIC xSrc, //在源图像上的水平偏移

OLE_YPOS_HIMETRIC ySrc, //在源图像上的垂直偏移

OLE_XSIZE_HIMETRIC cxSrc,//在源图像上水平拷贝的数量

OLE_YSIZE_HIMETRIC cySrc,//在源图像上垂直拷贝的数量

LPCRECT prcWBounds //指向目标图元设备环境句柄的指针);

小结:

到此为止,通过上述代码已经能够在程序的客户区内显示JPEG、GIF等标准的图像了,但对于有多帧(即有动画)的GIF格式的图像,目前还只能显示第一帧,如要完整的显示GIF 动画的全过程,还需要外部Active X控件的支持。

PS:本文引至于天极网。 还有给你推荐一个编程者的好去处,多去“CSDN”上混,呵呵。

还有对的EXIF信息读取看下楼

这个类中构造了两个结构MetadataDetail 和 Metadata ,前者是为了存储EXIF中某元素信息的三种格式,起到中间转化的作用,一个是十六进制的索引信息,一个是没用处理过的信息代码,一个是显示信息。后面的那个结构就是存储一张所有EXIF信息元素的。 有两个方法LookupEXIFValue 和 GetEXIFMetaData ,前一个方法是处理特殊元素的对应显示的,后者从中读取相关信息然后填充到MetaData结构中。

using System;

using SystemDrawing;

using SystemDrawingImaging;

using SystemCollections;

using SystemComponentModel;

namespace TestCom

{

/// <summary>

/// 功能:获得EXIF信息

/// 作者:Rexsp

/// 创建日期:2004-03-20

/// </summary>

public class EXIFMetaData

{

#region 构造函数

/// <summary>

/// 构造函数

/// </summary>

public EXIFMetaData()

{

}

#endregion

#region 数据转换结构

/// <summary>

/// 转换数据结构

/// </summary>

public struct MetadataDetail

{

public string Hex;//十六进制字符串

public string RawValueAsString;//原始值串

public string DisplayValue;//显示值串

}

#endregion

#region EXIF元素结构

/// <summary>

/// 结构:存储EXIF元素信息

/// </summary>

public struct Metadata

{

public MetadataDetail EquipmentMake;

public MetadataDetail CameraModel;

public MetadataDetail ExposureTime;//曝光时间

public MetadataDetail Fstop;

public MetadataDetail DatePictureTaken;

public MetadataDetail ShutterSpeed;// 快门速度

public MetadataDetail MeteringMode;//曝光模式

public MetadataDetail Flash;//闪光灯

public MetadataDetail XResolution;

public MetadataDetail YResolution;

public MetadataDetail ImageWidth;//照片宽度

public MetadataDetail ImageHeight;//照片高度

public MetadataDetail FNumber;// f值,光圈数

public MetadataDetail ExposureProg;// 曝光程序

public MetadataDetail SpectralSense;//

public MetadataDetail ISOSpeed;// ISO感光度

public MetadataDetail OECF;//

public MetadataDetail Ver;// EXIF版本

public MetadataDetail CompConfig;// 色彩设置

public MetadataDetail CompBPP;// 压缩比率

public MetadataDetail Aperture;// 光圈值

public MetadataDetail Brightness;// 亮度值Ev

public MetadataDetail ExposureBias;// 曝光补偿

public MetadataDetail MaxAperture;// 最大光圈值

public MetadataDetail SubjectDist;// 主体距离

public MetadataDetail LightSource;// 白平衡

public MetadataDetail FocalLength;// 焦距

public MetadataDetail FPXVer;// FlashPix版本

public MetadataDetail ColorSpace;// 色彩空间

public MetadataDetail Interop;//

public MetadataDetail FlashEnergy;//

public MetadataDetail SpatialFR;//

public MetadataDetail FocalXRes;//

public MetadataDetail FocalYRes;//

public MetadataDetail FocalResUnit;//

public MetadataDetail ExposureIndex;// 曝光指数

public MetadataDetail SensingMethod;// 感应方式

public MetadataDetail SceneType;//

public MetadataDetail CfaPattern;//

}

#endregion

#region 查找EXIF元素值

public string LookupEXIFValue(string Description, string Value)

{

string DescriptionValue = null;

switch(Description)

{

case "MeteringMode":

#region MeteringMode

{

switch(Value)

{

case "0":

DescriptionValue = "Unknown";break;

case "1":

DescriptionValue = "Average";break;

case "2":

DescriptionValue = "Center Weighted Average";break;

case "3":

DescriptionValue = "Spot";break;

case "4":

DescriptionValue = "Multi-spot";break;

case "5":

DescriptionValue = "Multi-segment";break;

case "6":

DescriptionValue = "Partial";break;

case "255":

DescriptionValue = "Other";break;

}

}

#endregion

break;

case "ResolutionUnit":

#region ResolutionUnit

{

switch(Value)

{

case "1":

DescriptionValue = "No Units";break;

case "2":

DescriptionValue = "Inch";break;

case "3":

DescriptionValue = "Centimeter";break;

}

}

#endregion

break;

//省略N行相似代码

}

return DescriptionValue;

}

#endregion

#region 取得的EXIF信息

public Metadata GetEXIFMetaData(string PhotoName)

{

// 创建一个的实例

SystemDrawingImage MyImage = SystemDrawingImageFromFile(PhotoName);

// 创建一个整型数组来存储图像中属性数组的ID

int[] MyPropertyIdList = MyImagePropertyIdList;

//创建一个封闭图像属性数组的实例

PropertyItem[] MyPropertyItemList = new PropertyItem[MyPropertyIdListLength];

//创建一个图像EXIT信息的实例结构对象,并且赋初值

#region 创建一个图像EXIT信息的实例结构对象,并且赋初值

Metadata MyMetadata = new Metadata();

MyMetadataEquipmentMakeHex = "10f";

MyMetadataCameraModelHex = "110";

MyMetadataDatePictureTakenHex = "9003";

MyMetadataExposureTimeHex = "829a";

MyMetadataFstopHex = "829d";

MyMetadataShutterSpeedHex = "9201";

MyMetadataMeteringModeHex = "9207";

MyMetadataFlashHex = "9209";

MyMetadataFNumberHex = "829d"; //

MyMetadataExposureProgHex = ""; //

MyMetadataSpectralSenseHex = "8824"; //

MyMetadataISOSpeedHex = "8827"; //

MyMetadataOECFHex = "8828"; //

MyMetadataVerHex = "9000"; //

MyMetadataCompConfigHex = "9101"; //

MyMetadataCompBPPHex = "9102"; //

MyMetadataApertureHex = "9202"; //

MyMetadataBrightnessHex = "9203"; //

MyMetadataExposureBiasHex = "9204"; //

MyMetadataMaxApertureHex = "9205"; //

MyMetadataSubjectDistHex = "9206"; //

MyMetadataLightSourceHex = "9208"; //

MyMetadataFocalLengthHex = "920a"; //

MyMetadataFPXVerHex = "a000"; //

MyMetadataColorSpaceHex = "a001"; //

MyMetadataFocalXResHex = "a20e"; //

MyMetadataFocalYResHex = "a20f"; //

MyMetadataFocalResUnitHex = "a210"; //

MyMetadataExposureIndexHex = "a215"; //

MyMetadataSensingMethodHex = "a217"; //

MyMetadataSceneTypeHex = "a301";

MyMetadataCfaPatternHex = "a302";

#endregion

// ASCII编码

SystemTextASCIIEncoding Value = new SystemTextASCIIEncoding();

int index = 0;

int MyPropertyIdListCount=MyPropertyIdListLength;

if(MyPropertyIdListCount!=0)

{

foreach (int MyPropertyId in MyPropertyIdList)

{

string hexVal = "";

MyPropertyItemList[index] = MyImageGetPropertyItem(MyPropertyId);

#region 初始化各属性值

string myPropertyIdString=MyImageGetPropertyItem(MyPropertyId)IdToString("x");

switch(myPropertyIdString)

{

case "10f":

{

MyMetadataEquipmentMakeRawValueAsString =BitConverterToString(MyImageGetPropertyItem (MyPropertyId)Value);

MyMetadataEquipmentMakeDisplayValue = ValueGetString(MyPropertyItemList[index]Value);

break;

}

case "110":

{

MyMetadataCameraModelRawValueAsString =BitConverterToString(MyImageGetPropertyItem(MyPropertyId)Value);

MyMetadataCameraModelDisplayValue =ValueGetString(MyPropertyItemList[index]Value);

break;

}

case "9003":

{

MyMetadataDatePictureTakenRawValueAsString =BitConverterToString(MyImageGetPropertyItem(MyPropertyId)Value);

MyMetadataDatePictureTakenDisplayValue =ValueGetString(MyPropertyItemList[index]Value);

break;

}

//省略N行相似代码

}

#endregion

index++;

}

}

MyMetadataXResolutionDisplayValue = MyImageHorizontalResolutionToString();

MyMetadataYResolutionDisplayValue = MyImageVerticalResolutionToString();

MyMetadataImageHeightDisplayValue = MyImageHeightToString();

MyMetadataImageWidthDisplayValue = MyImageWidthToString();

MyImageDispose();

return MyMetadata;

}

#endregion

}

}

然后就是个调用的问题,有了这个类,我如何读取的EXIF信息呢?代码如下:

EXIFMetaData em = new EXIFMetaData();

string filePath=ServerMapPath("Testjpg");//这里可以动态传递路径的

EXIFMetaDataMetadata m = emGetEXIFMetaData(filePath);//这里就是调用,传绝对路径

string exif = mVerDisplayValue;

string camera = mCameraModelDisplayValue;

string model = mCameraModelDisplayValue;

string aperture = mApertureDisplayValue;

string shutter = mShutterSpeedDisplayValue;

string sensitive = mExposureIndexDisplayValue;

用__DATA__,__TIME__,预编译宏格式化成你需要的字符串,把这个字符串存到标题里

例如:我希望的字符串是,日期:时间,参考下面的输出

printf("%s:%s",__DATA__,__TIME__)

你希望什么样子的字符串,你自己组

文件 *** 作 API 函数介绍

在VC中,大多数情况对文件的 *** 作都使用系统提供的 API 函数,但有的函数我们不是很熟悉,以下提供一些文件 *** 作 API 函数介绍:

一般文件 *** 作 API

CreateFile

打开文件

要对文件进行读写等 *** 作,首先必须获得文件句柄,通过该函数可以获得文件句柄,该函数是通向文件世界的大门。

ReadFile

从文件中读取字节信息。

在打开文件获得了文件句柄之后,则可以通过该函数读取数据。

WriteFile

向文件写入字节信息。

同样可以将文件句柄传给该函数,从而实现对文件数据的写入。

CloseHandle

关闭文件句柄。

打开门之后,自然要记得关上。

GetFileTime

获取文件时间。

有三个文件时间可供获取:创建时间、最后访问时间、最后写时间。

该函数同样需要文件句柄作为入口参数。

GetFileSize

获取文件大小。

由于文件大小可以高达上数G(1G需要30位),因此一个32位的双字节类型无法对其精确表达,因此返回码表示低32位,还有一个出口参数可以传出高32位。

该函数同样需要文件句柄作为入口参数。

GetFileAttributes

获取文件属性。

可以获取文件的存档、只读、系统、隐藏等属性。

该函数只需一个文件路径作为参数。

SetFileAttributes

设置文件属性。

能获取,自然也应该能设置。

可以设置文件的存档、只读、系统、隐藏等属性。

该函数只需一个文件路径作为参数。

GetFileInformationByHandle

获取所有文件信息

该函数能够获取上面所有函数所能够获取的信息,如大小、属性等,同时还包括一些其他地方无法获取的信息,比如:文件卷标、索引和链接信息。

该函数需要文件句柄作为入口参数。

GetFullPathName

获取文件路径,该函数获取文件的完整路径名。

需要提醒的是:只有当该文件在当前目录下,结果才正确。如果要得到真正的路径。应该用GetModuleFileName函数。

CopyFile

复制文件

注意:只能复制文件,而不能复制目录

MoveFileEx

移动文件

既可以移动文件,也可以移动目录,但不能跨越盘符。(Window2000下设置移动标志可以实现跨越盘符 *** 作)

DeleteFile

删除文件

GetTempPath

获取Windows临时目录路径

GetTempFileName

在Windows临时目录路径下创建一个唯一的临时文件

SetFilePoint

移动文件指针。

该函数用于对文件进行高级读写 *** 作时。

文件的锁定和解锁

LockFile

UnlockFile

LockFileEx

UnlockFileEx

以上四个函数用于对文件进行锁定和解锁。这样可以实现文件的异步 *** 作。可同时对文件的不同部分进行各自的 *** 作。

文件的压缩和解压缩

LZOpenFile

打开压缩文件以读取

LZSeek

查找压缩文件中的一个位置

LZRead

读一个压缩文件

LZClose

关闭一个压缩文件

LZCopy

复制压缩文件并在处理过程中展开

GetExpandedName

从压缩文件中返回文件名称。

以上六个函数为32位 API 中的一个小扩展库,文件压缩扩展库中的函数。文件压缩可以用命令 compress 创建。

文件内核对象

32位 API 提供一个称为文件映像的特性,它允许将文件直接映射为一个应用的虚拟内存空间,这一技术可用于简化和加速文件访问。

CreateFileMapping

创建和命名映射

MapViewOfFile

把文件映射装载如内存

UnmapViewOfFile

释放视图并把变化写回文件

FlushViewOfFile

将视图的变化刷新写入磁盘

希望通过以上几个常用的 API 函数,能快速的提高文件 *** 作过程函数的编写。

mkv 是一种视频文件,如果想 *** 作这类文件得首先知道文件的数据结构

这应该是一种商业文件,源码没公开。一般情况是读不了的,可以从网上找一些支持这种文件的控件,控件封装了对这类文件的信息的读取。没有开源的话也不好找

本来就是在在C:\中先FindFirstFile(),这个没什么可说的。

WIN32_FIND_DATAp;

HANDLEh=FindFirstFile("C:\\atxt",&p);

如果你觉得使用麻烦,可以自己封装一个。这个没有别的办法获取。

在C#中进行文件相关 *** 作主要用到几个类File,Directory,Path,FileInfo,DirectoryInfo,其中File中是进行文件的创建,移动,复制,删除,文件是否存在等等 *** 作,Directory是进行文件夹创建,移动,删除,文件夹是否存在等等 *** 作,Path主要用来获取路径相关信息,比如说一个路径中的文件名,文件的扩展名等等,FileInfo用来获取文件的信息,文件的大小,文件的创建日期和更新日期,DirectoryInfo用来获取文件夹的信息。

这些类都在SystemIO命名空间中,如果需要使用的话需要在C#中头部添加using SystemIO;,或者直接SystemIOFile的方式来使用。

关于这几个类的详细信息可以参照MSDN

File类:>

对关注性能的程序开发人员而言,一个好的计时部件既是益友,也是良师。计时器既可以作为程序组件帮助程序员精确的控制程序进程,又是一件有力的调试武器,在有经验的程序员手里可以尽快的确定程序的性能瓶颈,或者对不同的算法作出有说服力的性能比较。

在Windows平台下,常用的计时器有两种,一种是timeGetTime多媒体计时器,它可以提供毫秒级的计时。但这个精度对很多应用场合而言还是太粗糙了。另一种是QueryPerformanceCount计数器,随系统的不同可以提供微秒级的计数。对于实时图形处理、多媒体数据流处理、或者实时系统构造的程序员,善用QueryPerformanceCount/QueryPerformanceFrequency是一项基本功。

本文要介绍的,是另一种直接利用Pentium CPU内部时间戳进行计时的高精度计时手段。以下讨论主要得益于《Windows图形编程》一书,第 15页-17页,有兴趣的读者可以直接参考该书。关于RDTSC指令的详细讨论,可以参考Intel产品手册。本文仅仅作抛砖之用。

在 Intel Pentium以上级别的CPU中,有一个称为“时间戳(Time Stamp)”的部件,它以64位无符号整型数的格式,记录了自CPU上电以来所经过的时钟周期数。由于目前的CPU主频都非常高,因此这个部件可以达到纳秒级的计时精度。这个精确性是上述两种方法所无法比拟的。

在Pentium以上的CPU中,提供了一条机器指令RDTSC(Read Time Stamp Counter)来读取这个时间戳的数字,并将其保存在EDX:EAX寄存器对中。由于EDX:EAX寄存器对恰好是Win32平台下C++语言保存函数返回值的寄存器,所以我们可以把这条指令看成是一个普通的函数调用。像这样:

inline unsigned __int64 GetCycleCount()

{

__asm RDTSC

}

但是不行,因为RDTSC不被C++的内嵌汇编器直接支持,所以我们要用_emit伪指令直接嵌入该指令的机器码形式0X0F、0X31,如下:

inline unsigned __int64 GetCycleCount()

{

__asm _emit 0x0F

__asm _emit 0x31

}

以后在需要计数器的场合,可以像使用普通的Win32 API一样,调用两次GetCycleCount函数,比较两个返回值的差,像这样:

unsigned long t;

t = (unsigned long)GetCycleCount();

//Do Something time-intensive

t -= (unsigned long)GetCycleCount();

《Windows图形编程》第15页编写了一个类,把这个计数器封装起来。有兴趣的读者可以去参考那个类的代码。作者为了更精确的定时,做了一点小小的改进,把执行RDTSC指令的时间,通过连续两次调用GetCycleCount函数计算出来并保存了起来,以后每次计时结束后,都从实际得到的计数中减掉这一小段时间,以得到更准确的计时数字。但我个人觉得这一点点改进意义不大。在我的机器上实测,这条指令大概花掉了几十到100多个周期,在 Celeron 800MHz的机器上,这不过是十分之一微秒的时间。对大多数应用来说,这点时间完全可以忽略不计;而对那些确实要精确到纳秒数量级的应用来说,这个补偿也过于粗糙了。

这个方法的优点是:

1高精度。可以直接达到纳秒级的计时精度(在1GHz的CPU上每个时钟周期就是一纳秒),这是其他计时方法所难以企及的。

2 成本低。timeGetTime 函数需要链接多媒体库winmmlib,QueryPerformance 函数根据MSDN的说明,需要硬件的支持(虽然我还没有见过不支持的机器)和KERNEL库的支持,所以二者都只能在Windows平台下使用(关于DOS平台下的高精度计时问题,可以参考《图形程序开发人员指南》,里面有关于控制定时器8253的详细说明)。但RDTSC指令是一条CPU指令,凡是i386平台下Pentium以上的机器均支持,甚至没有平台的限制(我相信i386版本UNIX和Linux下这个方法同样适用,但没有条件试验),而且函数调用的开销是最小的。

3 具有和CPU主频直接对应的速率关系。一个计数相当于1/(CPU主频Hz数)秒,这样只要知道了CPU的主频,可以直接计算出时间。这和 QueryPerformanceCount不同,后者需要通过QueryPerformanceFrequency获取当前计数器每秒的计数次数才能换算成时间。

这个方法的缺点是:

1现有的C/C++编译器多数不直接支持使用RDTSC指令,需要用直接嵌入机器码的方式编程,比较麻烦。

2数据抖动比较厉害。其实对任何计量手段而言,精度和稳定性永远是一对矛盾。如果用低精度的timeGetTime来计时,基本上每次计时的结果都是相同的;而RDTSC指令每次结果都不一样,经常有几百甚至上千的差距。这是这种方法高精度本身固有的矛盾。

关于这个方法计时的最大长度,我们可以简单的用下列公式计算:

自CPU上电以来的秒数 = RDTSC读出的周期数 / CPU主频速率(Hz)

64位无符号整数所能表达的最大数字是18×10^19,在我的Celeron 800上可以计时大约700年(书中说可以在200MHz的Pentium上计时117年,这个数字不知道是怎么得出来的,与我的计算有出入)。无论如何,我们大可不必关心溢出的问题。

下面是几个小例子,简要比较了三种计时方法的用法与精度

//Timer1cpp 使用了RDTSC指令的Timer类//KTimer类的定义可以参见《Windows图形编程》P15

//编译行:CL Timer1cpp /link USER32lib

#include &ltstdioh>

#include "KTimerh"

main()

{

unsigned t;

KTimer timer;

timerStart();

Sleep(1000);

t = timerStop();

printf("Lasting Time: %d\n",t);

}

//Timer2cpp 使用了timeGetTime函数

//需包含&ltmmsysh>,但由于Windows头文件错综复杂的关系

//简单包含&ltwindowsh>比较偷懒:)

//编译行:CL timer2cpp /link winmmlib

#include &ltwindowsh>

#include &ltstdioh>

main()

{

DWORD t1, t2;

t1 = timeGetTime();

Sleep(1000);

t2 = timeGetTime();

printf("Begin Time: %u\n", t1);

printf("End Time: %u\n", t2);

printf("Lasting Time: %u\n",(t2-t1));

}

//Timer3cpp 使用了QueryPerformanceCounter函数

//编译行:CL timer3cpp /link KERNEl32lib

#include &ltwindowsh>

#include &ltstdioh>

main()

{

LARGE_INTEGER t1, t2, tc;

QueryPerformanceFrequency(&tc);

printf("Frequency: %u\n", tcQuadPart);

QueryPerformanceCounter(&t1);

Sleep(1000);

QueryPerformanceCounter(&t2);

printf("Begin Time: %u\n", t1QuadPart);

printf("End Time: %u\n", t2QuadPart);

printf("Lasting Time: %u\n",( t2QuadPart- t1QuadPart));

}

////////////////////////////////////////////////

//以上三个示例程序都是测试1秒钟休眠所耗费的时间

file://测/试环境:Celeron 800MHz / 256M SDRAM

// Windows 2000 Professional SP2

// Microsoft Visual C++ 60 SP5

////////////////////////////////////////////////

以下是Timer1的运行结果,使用的是高精度的RDTSC指令

Lasting Time: 804586872

以下是Timer2的运行结果,使用的是最粗糙的timeGetTime API

Begin Time: 20254254

End Time: 20255255

Lasting Time: 1001

以下是Timer3的运行结果,使用的是QueryPerformanceCount API

Frequency: 3579545

Begin Time: 3804729124

End Time: 3808298836

Lasting Time: 3569712

古人说,触类旁通。从一本介绍图形编程的书上得到一个如此有用的实时处理知识,我感到非常高兴。有美不敢自专,希望大家和我一样喜欢这个轻便有效的计时器。

使用定时器定时历遍该文件夹,使用CFindFile类可以历遍。

可对有些用户而言,并不太了解这个文件夹的位置,如果又没有安装专门的系统优化软件用于删除临时文件,有没有一种办法可以使得这类用户可以快速手动清除这些临时文件呢下面我们来介绍一种方法。

其实关键在于怎样快速定位到这个临时文件夹。打开“资源管理器”或者“我的电脑”,然后在地址栏中输入“%temp%”,并回车,即可打开这个文件夹,回车后可以看到这个文件夹的具体位置。选中其中的文件,按Del可以将这些文件放入回收站。如果按Shift+Del,则可以将文件彻底从硬盘中删除。

以上就是关于如何在vc中实现jpeg文件的显示和exif的读取全部的内容,包括:如何在vc中实现jpeg文件的显示和exif的读取、我用VC6编一个基于对话框的程序,怎么样实现对话框的标题就是编译生产exe文件的时间。、vc 如何打开 读取 txt 文件中的数值数据等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/10178085.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-06
下一篇2023-05-06

发表评论

登录后才能评论

评论列表(0条)

    保存