关于显示内存位图程序有一些有关问题,希望大家指导一上
关于显示内存位图程序有一些问题,希望大家指导一下
现在有一个自定义的视频文件,可以读出该文件的文件头和每帧的像素数据,现在要把该图片一帧一帧显示出来。下面是程序的一部分,出现的错误有些疑问,希望大家帮忙看看。
程序这样写的话运行时错误,提示"0x00403ecd"指令引用的"0xccccccd8"内存,该内存不能为"read"
程序改成这样的话就能正常运行
现在有一个自定义的视频文件,可以读出该文件的文件头和每帧的像素数据,现在要把该图片一帧一帧显示出来。下面是程序的一部分,出现的错误有些疑问,希望大家帮忙看看。
case WM_CREATE:
imageFile.openFile();//我自己定义的类,打开该视频文件
width = imageFile.fileHeader.ImageWidth();//读取该视频文件的宽度
hight = imageFile.fileHeader.ImageHight();//读取该视频文件的高度
Len = width * hight;
fbuf = (BYTE*) malloc((Len) * sizeof(BYTE));
pBitMapInfo = (BITMAPINFO*) Buffer;//前面定义的类型static BITMAPINFO* pBitMapInfo;
pBitMapInfo->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
pBitMapInfo->bmiHeader.biWidth = width;
pBitMapInfo->bmiHeader.biHeight = hight;
pBitMapInfo->bmiHeader.biPlanes = 1;
pBitMapInfo->bmiHeader.biBitCount = 8;
pBitMapInfo->bmiHeader.biCompression = BI_RGB;
for(i = 0; i < 256; i++)
{
BYTE byGray = (BYTE)i;
pBitMapInfo->bmiColors[i].rgbRed = byGray;
pBitMapInfo->bmiColors[i].rgbGreen = byGray;
pBitMapInfo->bmiColors[i].rgbBlue = byGray;
}
return 0;
case WM_PAINT :
hdc = BeginPaint (hwnd, &ps) ;
imageFile.frameData.SetFrame(frame);//定位到该视频的frame帧,视频只有47帧,frame<=47
for(i = 0; i < Len;i++)
{
pixelData = imageFile.frameData.PxielData();//pixelData存储每像素的数据,每像素用16位表示
fbuf[i] = LOBYTE(pixelData); //只显示该视频像素的低八位
}
//TextOut(hdc, 0, 0, szBuffer,wsprintf(szBuffer, TEXT("%5d"), width));
SetDIBitsToDevice(hdc,
0,
0,
width,
hight,
0,
0,
0,
hight,
fbuf,
pBitMapInfo,
DIB_RGB_COLORS
);
//TextOut(hdc,400,10,szBuffer,wsprintf(szBuffer, TEXT("%5d"),frame));
frame++;
//free(fbuf);
Sleep(100);
if(frame <= 47)
{
InvalidateRect(hwnd,NULL,false);
}
EndPaint (hwnd, &ps) ;
return 0 ;
程序这样写的话运行时错误,提示"0x00403ecd"指令引用的"0xccccccd8"内存,该内存不能为"read"
程序改成这样的话就能正常运行
switch (message)
{
case WM_CREATE:
return 0;
case WM_PAINT :
hdc = BeginPaint (hwnd, &ps) ;
imageFile.openFile();
width = imageFile.fileHeader.ImageWidth();
hight = imageFile.fileHeader.ImageHight();
Len = width * hight;
fbuf = (BYTE*) malloc((Len) * sizeof(BYTE));
imageFile.frameData.SetFrame(frame);
for(i = 0; i < Len;i++)