Delphi 6/7调用.Net应用的一种折衷方式

N久没更新了 过年去了~~
前面在做pdf相关工作,包括控制扫描仪到生成双层pdf文件
其中有很多步骤都是调用其它程序完成
比如文通的OCR组件,只提供了命令行的调用(一方面是因其SDK功能比较单一)
另外扫描的图片调整大小、压缩的过程
Delphi中只能用Canvas.StrentchDraw方法,效果实在是不能恭维
.Net中System.Drawing空间中这方面有不错的控制,比如可以采用软件插值来产生高质量缩略图

下面是google的一段,出处不清楚了。。
/// <summary>
        
/// 生成缩略图
        
/// </summary>
        
/// <param name="originalImagePath">源图路径(物理路径)</param>
        
/// <param name="thumbnailPath">缩略图路径(物理路径)</param>
        
/// <param name="width">缩略图宽度</param>
        
/// <param name="height">缩略图高度</param>
        
/// <param name="mode">生成缩略图的方式</param>    

        public static void MakeThumbnail(string originalImagePath, string thumbnailPath, int width, int height, string mode)
        
{
            
try
            
{
                System.Drawing.Image originalImage 
= System.Drawing.Image.FromFile(originalImagePath);
           

            
int towidth = width;
            
int toheight = height;

            
int x = 0;
            
int y = 0;
            
int ow = originalImage.Width;
            
int oh = originalImage.Height;

            
switch (mode)
            
{
                
case "HW"://指定高宽缩放(可能变形)                
                    break;
                
case "W"://指定宽,高按比例                    
                    toheight = originalImage.Height * width / originalImage.Width;
                    
break;
                
case "H"://指定高,宽按比例
                    towidth = originalImage.Width * height / originalImage.Height;
                    
break;
                
case "Cut"://指定高宽裁减(不变形)                
                    if ((double)originalImage.Width / (double)originalImage.Height > (double)towidth / (double)toheight)
                    
{
                        oh 
= originalImage.Height;
                        ow 
= originalImage.Height * towidth / toheight;
                        y 
= 0;
                        x 
= (originalImage.Width - ow) / 2;
                    }

                    
else
                    
{
                        ow 
= originalImage.Width;
                        oh 
= originalImage.Width * height / towidth;
                        x 
= 0;
                        y 
= (originalImage.Height - oh) / 2;
                    }

                    
break;
                
default:
                    
break;
            }


            
//新建一个bmp图片
            System.Drawing.Image bitmap = new System.Drawing.Bitmap(towidth, toheight);

            
//新建一个画板
            System.Drawing.Graphics g = System.Drawing.Graphics.FromImage(bitmap);

            
//设置高质量插值法
            g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.High;

            
//设置高质量,低速度呈现平滑程度
            g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;

            
//清空画布并以透明背景色填充
            g.Clear(System.Drawing.Color.Transparent);

            
//在指定位置并且按指定大小绘制原图片的指定部分
            g.DrawImage(originalImage, new System.Drawing.Rectangle(00, towidth, toheight),
                
new System.Drawing.Rectangle(x, y, ow, oh),
                System.Drawing.GraphicsUnit.Pixel);

            
try
            
{
                
//以jpg格式保存缩略图
                bitmap.Save(thumbnailPath, System.Drawing.Imaging.ImageFormat.Bmp);
            }

            
catch (System.Exception e)
            
{
                
throw e;
            }

            
finally
            
{
                originalImage.Dispose();
                bitmap.Dispose();
                g.Dispose();
            }

        }

        
catch (Exception err)
        
{
        }

        }

    }

做成托管exe后
可以通过参数传递实现在delphi中调用
下述函数用来控制调用流程,保证在调用结束后delphi程序才继续执行
//执行程序并等待结束
function TForm2.WinExecAndWait32(FileName:String; Visibility :
integer):Integer;
var
  zAppName:
array[0..512] of char;
  zCurDir:
array[0..255] of char;
  WorkDir:
String;
  StartupInfo:TStartupInfo;
  ProcessInfo:TProcessInformation;
  Res: Cardinal;
begin
  StrPCopy(zAppName,FileName);
  GetDir(
0,WorkDir);
  StrPCopy(zCurDir,WorkDir);
  FillChar(StartupInfo,Sizeof(StartupInfo),#
0);
  StartupInfo.cb :
= Sizeof(StartupInfo);

  StartupInfo.dwFlags :
= STARTF_USESHOWWINDOW;
  StartupInfo.wShowWindow :
= Visibility;
  
if not CreateProcess(nil,
    zAppName,                      { pointer 
to command line string }
    nil,                           { pointer 
to process security attributes }
    nil,                           { pointer 
to thread security attributes }
    
false,                         { handle inheritance flag }
    CREATE_NEW_CONSOLE 
or          { creation flags }
    NORMAL_PRIORITY_CLASS,
    nil,                           { pointer 
to new environment block }
    nil,                           { pointer 
to current directory name }
    StartupInfo,                   { pointer 
to STARTUPINFO }
    ProcessInfo) 
then Result := -1 { pointer to PROCESS_INF }
  
else begin
    WaitforSingleObject(ProcessInfo.hProcess,INFINITE);
    GetExitCodeProcess(ProcessInfo.hProcess,Res);
    Result :
= Res;
  
end;
end;
原文地址:https://www.cnblogs.com/calmzeal/p/682376.html