求翻译C++代码为Delphi(保存文件100分)
- C/C++ code
void CDemoDlg::OnBnClickedBtnCapture(){ int ret = 0, nWidth = 0, nHeight = 0; unsigned char buffer[IDFP_IMG_WIDTH*IDFP_IMG_HEIGHT + 1078] = {0}; LIVESCAN_BeginCapture(0); if((ret = LIVESCAN_GetFPBmpData(0, buffer)) > 0) { BITMAPFILEHEADER *bmpfheader = (BITMAPFILEHEADER *)buffer; BITMAPINFO *bmpinfo = (BITMAPINFO *)(((char*)bmpfheader) + 14); nWidth = bmpinfo->bmiHeader.biWidth; nHeight = bmpinfo->bmiHeader.biHeight; HBITMAP hb = BuildImage(buffer + 1078, bmpinfo->bmiHeader.biWidth, bmpinfo->bmiHeader.biHeight); GetDlgItem(IDC_STATIC_IMAGE)->SendMessage(STM_SETIMAGE, IMAGE_BITMAP, (LPARAM)hb); DeleteObject(hb); hb = NULL; SaveToFile("image.bmp", buffer, IDFP_IMG_WIDTH*IDFP_IMG_HEIGHT+1078); SetDlgItemText(IDC_EDT_INFO, "采集图像成功"); } else { LIVESCAN_GetErrorInfo(ret, pszErrorInfo); str.Format("采集图像失败, %s", pszErrorInfo); SetDlgItemText(IDC_EDT_INFO, str); } LIVESCAN_EndCapture(0);}首先是上面这个,怎么才能把一个PChar类型的值给一个image控件呢?
下面是我翻译的
- Delphi(Pascal) code
procedure TForm1.btn1Click(Sender: TObject);var i, ret, nWidth, nHeight: Integer; buffer: PAnsiChar; f: file; aa: TOFStruct; b: array of Byte; s: string; tf: TFileStream;begin GetMem(buffer, IDFP_IMG_WIDTH * IDFP_IMG_HEIGHT + 1078); LIVESCAN_BeginCapture(0); ret := LIVESCAN_GetFPBmpData(0, buffer); if ret > 0 then begin try //到这里就翻译不下去了,尝试好多种方法,无能为力。这时候的buffer是有值的,打印出来可以。 except on e: Exception do begin ShowMessage(e.Message); end; end; lst1.Items.Text := '采集图像成功!'; end else begin LIVESCAN_GetErrorInfo(ret, pszErrorInfo); ShowMessage(pszErrorInfo); end;end;
- C/C++ code
int SaveToFile(const char *fileName, void *buffer, int size){ FILE *f=fopen(fileName, "wb"); if(f==NULL) { printf("Open file %s to write fail.\n", fileName); return 0; } fwrite(buffer, size, 1, f); fclose(f); return 1;}上面这小段代码是最重要的,我搞了好久了,翻译都不成功,不知道怎么把PChar类型保存为一个bmp文件,换了好多种方法和转变好多种类型都不会...
[解决办法]
你就把pchar当成string么。然后用流操作也可以
[解决办法]
BITMAPFILEHEADER *bmpfheader = (BITMAPFILEHEADER *)buffer;
BITMAPINFO *bmpinfo = (BITMAPINFO *)(((char*)bmpfheader) + 14);
指针强制转换啊
var
bmp_header: PBitmapFileHeader;
bmp_info: PBitmapInfo;
...
bmp_header := Pointer(buffer);
bmp_info := Pointer(buffer + 4);
saveToFile就更简单了
查查函数:
FileCreate
FileWrite
FileClose
[解决办法]
var
s:TMemoryStream;
begin
s:=TMemoryStream.Create;
s.readbuffer(buffer,size);
s.SaveTofile(filename);
s.Free;
end;
[解决办法]
把buffer写到TMemoryStream里应该用Writebuffer,而不是readbuffer