• 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;
  • 相关阅读:
    第五篇:JMeter 定时器
    第四篇:JMeter 性能测试基本过程及示例
    第三篇:JMeter 组件手册
    第一篇 HTTP 协议报文结构及示例
    第二篇 JMeter 目录及关键配置分析
    第一篇:什么是 JMeter和为什么选择Jmeter做性能测试
    教你如何识别百度蜘蛛IP含义
    DEDECMS安装之后需要做的安全处理和须知
    织梦联动类别-地区调用不显示第三级城市的原因
    CSS的特效
  • 原文地址:https://www.cnblogs.com/calmzeal/p/682376.html
Copyright © 2020-2023  润新知