我正在使用Delphitwain(delphitwain.sourceforge.net)向我的应用添加扫描功能。扫描工作正常,我可以保存bmp和jpeg文件。现在我需要:
在挖掘之后,我找到了2个提示:
http://www.delphipraxis.net/132787-farbstich-nach-bitmap-operation.html
http://synopse.info/fossil/wiki?name=GDI%2B
这是我的最终代码:
procedure TForm1.GoAcquireClick(Sender: TObject);
begin
Counter := 0;
Twain.SourceManagerLoaded := TRUE;
Twain.LoadSourceManager;
Twain.TransferMode := ttmMemory;
with Twain.Source[ 0 ] do
begin
Loaded := TRUE;
SetIXResolution(300);
SetIYResolution(300);
SetIBitDepth(1);
EnableSource(true, true);
while Enabled do Application.ProcessMessages;
end;
end;
procedure TForm1.TwainTwainAcquire(Sender: TObject; const Index: Integer;
Image: TBitmap; var Cancel: Boolean);
var
TiffHolder: TSynPicture;
begin
Inc( Counter );
Current := Counter;
ImageHolder.Picture.Assign( Image );
ImageHolder.Picture.Bitmap.Monochrome := true;
ImageHolder.Picture.Bitmap.Pixelformat := pf1Bit;
SynGDIPlus.SaveAs(ImageHolder.Picture, format('c:\temp\teste%d.tif',[ Counter ]), gptTIF );
end;
结果:图像仍然是96dpi并保存为BMP(即使使用TIF扩展名)。
我错过了什么?
答案 0 :(得分:1)
GDI +库可以保存tiff图片。
SynGdiPlus装置使用{557CF405-1A04-11D3-9A73-0000F81EF32E}作为其TIFF编码器。
从TSynPicture.SaveAs
代码中,我看到了两种可能性:
试试这个版本:
type
/// the optional TIFF compression levels
// - use e.g. ord(evCompressionCCITT4) to save a TIFF picture as CCITT4
TGDIPPEncoderValue = (
evColorTypeCMYK,
evColorTypeYCCK,
evCompressionLZW,
evCompressionCCITT3,
evCompressionCCITT4,
evCompressionRle,
evCompressionNone,
(...)
evFrameDimensionPage);
const
EncoderCompression: TGUID = '{e09d739d-ccd4-44ee-8eba-3fbf8be4fc58}';
function TSynPicture.SaveAs(Stream: TStream; Format: TGDIPPictureType;
CompressionQuality: integer): TGdipStatus;
var fStream: IStream;
Len,Dummy: Int64;
tmp: pointer;
Params: TEncoderParameters;
PParams: pointer;
MS: TMemoryStream absolute Stream;
begin
if not Gdip.Exists or (Stream=nil) or (fImage=0) then begin
result := stInvalidParameter;
exit;
end;
Params.Count := 1;
Params.Parameter[0].Type_ := EncoderParameterValueTypeLong;
Params.Parameter[0].NumberOfValues := 1;
Params.Parameter[0].Value := @CompressionQuality;
PParams := nil;
case Format of
gptJPG: if CompressionQuality>=0 then begin
Params.Parameter[0].Guid := EncoderQuality;
PParams := @Params;
end;
gptTIF: begin
if not (TGDIPPEncoderValue(CompressionQuality) in [
evCompressionLZW, evCompressionCCITT3, evCompressionCCITT4,
evCompressionRle, evCompressionNone]) then
// default tiff compression is LZW
CompressionQuality := ord(evCompressionLZW);
Params.Parameter[0].Guid := EncoderCompression;
PParams := @Params;
end;
end;
CreateStreamOnHGlobal(0, true, fStream);
(...)
它会为TIFF图片添加EncoderCompression
参数,seems to be required。
我已更新源代码存储库版本以包含此更正。
答案 1 :(得分:0)
在Delphi中保存TIFF文件很难。我不知道这样做的任何免费/开源模块。
ImageEn有效。
过去我使用save作为bmp并使用命令行通过createprocess将irfanview转换为tiff 'i_view32.exe c:\ temp \ scanning.bmp / bpp = 1 /convert=c:\temp\scanned.tif'