我有一个围绕 edsdk 构建的 Delphi 程序。我可以拍照,下载原始文件的直接jpg。但是当我得到一个原始(CR2)文件时,我无法显示结果。任何解决方案都可以做到这一点,但我最近的尝试是遵循这个答案,因为我很难将大多数其他示例的 c#-code 转换为 Delphi。这就是我现在所拥有的:
procedure TShooter.JPegFromRaw(rawFileName, JPegFileName: TFileName);
var rawStream, jpgStream: EdsStreamRef;
imgRef: EdsImageRef;
imageInfo: EdsImageInfo;
jpgQuality: EdsSaveImageSetting;
begin
try
jpgQuality.JPEGQuality := 9;
jpgQuality.iccProfileStream := nil;
jpgQuality.reserved := 0;
raiseError(EdsCreateFileStream(PChar(rawFileName),
kEdsFileCreateDisposition_OpenExisting,
kEdsAccess_Read, rawStream));
raiseError(EdsCreateFileStream(PChar(JPegFileName),
kEdsFileCreateDisposition_CreateAlways,
kEdsAccess_Write, jpgStream));
raiseError(EdsCreateImageRef(rawStream, imgRef));
raiseError(EdsGetImageInfo(imgRef, kEdsImageSrc_FullView, imageInfo));
raiseError(EdsSaveImage(imgRef, kEdsTargetImageType_Jpeg, jpgQuality, jpgStream));
finally
raiseError(EdsRelease(jpgStream));
raiseError(EdsRelease(rawStream));
raiseError(EdsRelease(imgRef));
end { try };
end;
执行此操作时,它会在最后一行 ( EdsSaveImage(...)
) 中抛出 EDS_ERR_INVALID_HANDLE。之前的那一行并没有真正影响结果,但由于它也使用了 imgRef,所以我把它留在那里。由于它返回 ERR_OK,我假设 imgRef 是正确的。但后来我迷失了还有什么可能导致错误。