读书人

求通译C++代码为Delphi(保存文件100分

发布时间: 2012-09-17 12:06:51 作者: rapoo

求翻译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

读书人网 >.NET

热点推荐