Просмотр исходного кода

Demo - 图片对照流程/实现环节优化

zhudongyong 2 лет назад
Родитель
Сommit
14dab2b6b2

BIN
KdanAutoTest/KdanAuto.xcodeproj/project.xcworkspace/xcuserdata/zhudongyong.xcuserdatad/UserInterfaceState.xcuserstate


+ 3 - 3
KdanAutoTest/KdanAuto/Base.lproj/Main.storyboard

@@ -263,7 +263,7 @@
                                                     <color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
                                                 </textFieldCell>
                                             </textField>
-                                            <scrollView borderType="none" horizontalLineScroll="10" horizontalPageScroll="10" verticalLineScroll="10" verticalPageScroll="10" hasHorizontalScroller="NO" usesPredominantAxisScrolling="NO" id="AmP-9q-6TA">
+                                            <scrollView borderType="none" horizontalLineScroll="10" horizontalPageScroll="10" verticalLineScroll="10" verticalPageScroll="10" hasHorizontalScroller="NO" hasVerticalScroller="NO" usesPredominantAxisScrolling="NO" id="AmP-9q-6TA">
                                                 <rect key="frame" x="40" y="338" width="475" height="113"/>
                                                 <autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMinY="YES"/>
                                                 <clipView key="contentView" drawsBackground="NO" id="n3n-SJ-Ypz">
@@ -280,8 +280,8 @@
                                                     <rect key="frame" x="-100" y="-100" width="475" height="16"/>
                                                     <autoresizingMask key="autoresizingMask"/>
                                                 </scroller>
-                                                <scroller key="verticalScroller" wantsLayer="YES" verticalHuggingPriority="750" doubleValue="1" horizontal="NO" id="RDM-Fo-oeX">
-                                                    <rect key="frame" x="459" y="0.0" width="16" height="113"/>
+                                                <scroller key="verticalScroller" hidden="YES" wantsLayer="YES" verticalHuggingPriority="750" doubleValue="1" horizontal="NO" id="RDM-Fo-oeX">
+                                                    <rect key="frame" x="-100" y="-100" width="15" height="113"/>
                                                     <autoresizingMask key="autoresizingMask"/>
                                                 </scroller>
                                             </scrollView>

+ 2 - 2
KdanAutoTest/KdanAuto/Class/AutoTestCase/AutoTest.swift

@@ -78,7 +78,7 @@ class AutoTest : NSObject, AutoTestProtocal {
     }
     
     func name() -> String {
-        return "未指定类型对照测试"
+        return "对照测试"
     }
     
     func keys() -> NSArray {
@@ -202,7 +202,7 @@ class AutoTest : NSObject, AutoTestProtocal {
                                 if ( processSuccess &&
                                      FileManager.default.fileExists(atPath: rComparePath)) {
                                     
-                                    let degree = ImageProcess.compareJPEG(rComparePath, checkPath: cComparePath)
+                                    let degree = ImageProcess.compareJPEG(rComparePath, checkPath: cComparePath, processCover: true)
                                     
                                     if isDirectory.boolValue {
                                         TestDegreeManager.shared().set(degree,

+ 1 - 1
KdanAutoTest/KdanAuto/Class/AutoTestCase/StringAutoTest.swift

@@ -241,7 +241,7 @@ class CharacterAutoTest : AutoTest {
                         if (processSuccess &&
                             FileManager.default.fileExists(atPath: rComparePath)) {
                             
-                            let degree = ImageProcess.compareJPEG(rComparePath, checkPath: cComparePath)
+                            let degree = ImageProcess.compareJPEG(rComparePath, checkPath: cComparePath, processCover: true)
                             
                             if degree == -1 {
                                 self.reportString?.append(NSMutableAttributedString.init(string: "【\(String(self.fileType())) - \(self.name())】文件 \"\(fName)\"快照对比失败,生成快照失败或无比对文件\n",

+ 1 - 1
KdanAutoTest/KdanAuto/Class/AutoTestCase/TextColorAutoTest.swift

@@ -280,7 +280,7 @@ class TextColorAutoTest : AutoTest {
                         if (ProcessThumbnal.process(resultPath, desPath: rComparePath, outputSize: CGSize.init(width: 2048, height: 2048)) &&
                             FileManager.default.fileExists(atPath: rComparePath)) {
                             
-                            let degree = ImageProcess.compareJPEG(rComparePath, checkPath: cComparePath)
+                            let degree = ImageProcess.compareJPEG(rComparePath, checkPath: cComparePath, processCover: true)
                             
                             if degree == -1 {
                                 self.reportString?.append(NSMutableAttributedString.init(string: "【\(String(self.fileType())) - \(self.name())】文件 \"\(fName)\"快照对比失败,生成快照失败或无比对文件\n",

+ 2 - 2
KdanAutoTest/KdanAuto/Class/CompareViewController/CompareViewController.swift

@@ -32,7 +32,7 @@ class CompareViewController: NSViewController, NSTableViewDataSource, NSTableVie
         return sharedCViewController!
     }
     
-    func showIn(_ view:NSView?) {
+    func showIn(_ view:NSView?, rect:NSRect) {
         if _popover == nil {
             _popover = NSPopover.init()
             _popover.contentViewController = self;
@@ -40,7 +40,7 @@ class CompareViewController: NSViewController, NSTableViewDataSource, NSTableVie
         }
         _popover.contentSize = self.view.frame.size
         
-        _popover.show(relativeTo: NSRect(x: 0, y: 0, width: 0, height: 0), of: view!, preferredEdge: NSRectEdge.minX)
+        _popover.show(relativeTo: rect, of: view!, preferredEdge: NSRectEdge.minX)
     }
     
     // Getter & Setter

+ 42 - 6
KdanAutoTest/KdanAuto/Class/CompareViewController/ImageCompareCellView.swift

@@ -12,6 +12,7 @@ class ImageCompareCellView : NSTableCellView {
     @IBOutlet var _titleLbl : NSTextField!
     @IBOutlet var _degreeInfoLbl : NSTextField!
     
+    @IBOutlet var _activityView : NSProgressIndicator!
     
     @IBOutlet var _contentView : NSView!
     @IBOutlet var _imageView01 : NSImageView!
@@ -72,7 +73,12 @@ class ImageCompareCellView : NSTableCellView {
             let image2 = NSImage.init(contentsOfFile: resultPath)
             _imageView02.image = image2;
             
-            setTitle(String("[\(_fileInfo.objc().fileType()):\(_fileInfo.objc().name())]:\(_fileInfo.fileName())"))
+            if (nil == _fileInfo.refFilePath()) {
+                setTitle(String("[\(_fileInfo.objc().fileType()):\(_fileInfo.objc().name())]\(_fileInfo.fileName())"))
+            }else {
+                let lastPathComponent = NSString(string: _fileInfo.refFilePath()!).lastPathComponent
+                setTitle(String("[\(_fileInfo.objc().fileType()):\(_fileInfo.objc().name())]\(_fileInfo.fileName())/\(lastPathComponent)"))
+            }
 
             let degree = _fileInfo.degree()
             if degree == -1 {
@@ -90,6 +96,12 @@ class ImageCompareCellView : NSTableCellView {
             setTitle("")
             _degreeInfoLbl.stringValue = ""
         }
+        
+        
+        _activityView.isHidden = true;
+        _activityView.stopAnimation(nil)
+        
+        _showCoverBtn.isHidden = _segmentedControl.indexOfSelectedItem == 0
     }
     
     public func fileInfo() -> NSMutableDictionary {
@@ -131,15 +143,39 @@ class ImageCompareCellView : NSTableCellView {
             
             let image = NSImage.init(contentsOfFile: comparePath)
             _imageView03.image = image;
+            self._imageView04.image = nil;
             _imageView04.isHidden = _showCoverBtn.state == .off || _segmentedControl.indexOfSelectedItem != 1
             
 //            let image2 = NSImage.init(contentsOfFile: resultPath)
 //            _imageView04.image = image2;
-            DispatchQueue.global().async {
-                let image2 = ImageProcess.processImage(resultPath, checkPath: comparePath)
-
-                DispatchQueue.main.sync {
-                    self._imageView04.image = image2
+            let degree = _fileInfo.degree()
+            if (abs(degree - 100) > 0) {
+                _activityView.isHidden = false
+                _activityView.startAnimation(sender)
+                DispatchQueue.global().async {
+                    var image2 = nil as NSImage?
+                    
+                    let coverPath = NSString(format: "%@_cover.png", NSString(string: resultPath).deletingPathExtension) as! String
+                    
+                    if FileManager.default.fileExists(atPath: coverPath) {
+                        image2 = NSImage.init(contentsOfFile: coverPath)
+                    }else {
+                        image2 = ImageProcess.processImage(resultPath, checkPath: comparePath)
+                        
+                        if nil != image2 {
+                            let rep = NSBitmapImageRep.init(cgImage: image2!.cgImage(forProposedRect: nil, context: nil, hints: nil)!)
+                            let data = rep.representation(using: NSBitmapImageRep.FileType.png, properties: [:]);
+                            
+                            let url = URL.init(fileURLWithPath: coverPath, isDirectory: false)
+                            try? data!.write(to: url)
+                        }
+                    }
+                    
+                    DispatchQueue.main.sync {
+                        self._imageView04.image = image2
+                        self._activityView.isHidden = true
+                        self._activityView.stopAnimation(sender)
+                    }
                 }
             }
         }

+ 12 - 7
KdanAutoTest/KdanAuto/Class/CompareViewController/ImageCompareCellView.xib

@@ -14,7 +14,7 @@
             <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
             <subviews>
                 <textField horizontalHuggingPriority="251" verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="ZfV-Hf-yE5">
-                    <rect key="frame" x="0.0" y="777" width="997" height="21"/>
+                    <rect key="frame" x="0.0" y="777" width="669" height="21"/>
                     <autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMinY="YES"/>
                     <textFieldCell key="cell" lineBreakMode="clipping" title="Label" id="yAG-7D-A8X">
                         <font key="font" metaFont="systemMedium" size="13"/>
@@ -53,12 +53,12 @@
                     <autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMaxY="YES"/>
                 </customView>
                 <segmentedControl verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="ufK-rE-IEg">
-                    <rect key="frame" x="890" y="774" width="90" height="24"/>
+                    <rect key="frame" x="907" y="774" width="90" height="24"/>
                     <autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMinY="YES"/>
                     <segmentedCell key="cell" borderStyle="border" alignment="left" style="texturedRounded" trackingMode="selectOne" id="O6q-zB-76q">
                         <font key="font" metaFont="system"/>
                         <segments>
-                            <segment label="横向" width="41"/>
+                            <segment label="横向" width="41" selected="YES"/>
                             <segment label="覆盖" width="40" tag="1"/>
                         </segments>
                     </segmentedCell>
@@ -67,7 +67,7 @@
                     </connections>
                 </segmentedControl>
                 <button verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="erM-rI-DzI">
-                    <rect key="frame" x="796" y="772" width="87" height="26"/>
+                    <rect key="frame" x="709" y="772" width="87" height="26"/>
                     <autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMinY="YES"/>
                     <buttonCell key="cell" type="squareTextured" title="隐藏覆盖层" bezelStyle="texturedSquare" alignment="center" state="on" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="bTH-6J-0ln">
                         <behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
@@ -78,16 +78,21 @@
                     </connections>
                 </button>
                 <textField horizontalHuggingPriority="251" verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="Ooh-60-kZ8">
-                    <rect key="frame" x="412" y="779" width="173" height="16"/>
-                    <autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMaxX="YES" flexibleMinY="YES"/>
-                    <textFieldCell key="cell" lineBreakMode="clipping" alignment="center" title="相似度:" id="7cX-su-WGo">
+                    <rect key="frame" x="797" y="778" width="106" height="16"/>
+                    <autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMinY="YES"/>
+                    <textFieldCell key="cell" lineBreakMode="clipping" alignment="center" title="相似度:888.88%" id="7cX-su-WGo">
                         <font key="font" metaFont="system"/>
                         <color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
                         <color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
                     </textFieldCell>
                 </textField>
+                <progressIndicator fixedFrame="YES" maxValue="100" displayedWhenStopped="NO" indeterminate="YES" controlSize="small" style="spinning" translatesAutoresizingMaskIntoConstraints="NO" id="vNa-8q-xlf">
+                    <rect key="frame" x="684" y="777" width="16" height="16"/>
+                    <autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMinY="YES"/>
+                </progressIndicator>
             </subviews>
             <connections>
+                <outlet property="_activityView" destination="vNa-8q-xlf" id="xel-yq-lrM"/>
                 <outlet property="_contentView" destination="l0O-8O-W8F" id="xFJ-xl-ppI"/>
                 <outlet property="_degreeInfoLbl" destination="Ooh-60-kZ8" id="tRz-ZD-Ynf"/>
                 <outlet property="_imageView01" destination="vKi-Ja-iHX" id="BOc-W2-6Zi"/>

+ 18 - 0
KdanAutoTest/KdanAuto/Class/DataModel/TestDegreeManager.swift

@@ -15,6 +15,24 @@ class TestDegreeManager : NSObject {
         return tdManager
     }
     
+    
+    override init() {
+        var path = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true).first!
+        path = NSString(string: path).appendingPathComponent("TestDegreeData.plist");
+        
+        if let info = try? NSDictionary.init(contentsOfFile: path) {
+            degreeInfo = NSMutableDictionary.init(dictionary: info);
+        }
+    }
+    
+    func saveInfo() {
+        var path = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true).first!
+        path = NSString(string: path).appendingPathComponent("TestDegreeData.plist");
+        
+        try! degreeInfo.write(toFile: path, atomically: true)
+    }
+    
+    
     // Clear
     func clearAllHistory() {
         degreeInfo.removeAllObjects()

+ 5 - 4
KdanAutoTest/KdanAuto/Class/Norrmal/AutoTestAdvanceSettingView.swift

@@ -98,11 +98,11 @@ class AutoTestAdvanceSettingView : NSView, NSTableViewDataSource, NSTableViewDel
             var height = CGFloat((_keyViews.count + 1)/kItemCountPerRow * (Int(kCheckBtnDefaultHeight) + 5));
         
             //        _keyContentView.frame = NSRect(x: 0, y: 0, width: width, height: kTFDefaultHeight)
-            if (height > _keyScrollView.frame.height) {
+            if ((height+28) > _keyScrollView.frame.height) {
                 _keyContentView.setFrameSize(NSSize.init(width: _keyScrollView.frame.width - 28, height: height))
             }else {
-                height = _keyScrollView.frame.height - 20
-                _keyContentView.setFrameSize(NSSize.init(width: _keyScrollView.frame.width - 28, height: _keyScrollView.frame.height))
+                height = _keyScrollView.frame.height - 28
+                _keyContentView.setFrameSize(NSSize.init(width: _keyScrollView.frame.width - 28, height: height))
             }
             
             for btn in _keyViews {
@@ -322,7 +322,8 @@ class AutoTestAdvanceSettingView : NSView, NSTableViewDataSource, NSTableViewDel
         if nil != files && files.count > 0 {
             let compareVC = CompareViewController.shared()
             compareVC.setFiles(files)
-            compareVC.showIn(sender)
+            let point = sender.convert(NSPoint.zero, to: self)
+            compareVC.showIn(self, rect: NSRect.init(origin: point, size: sender.frame.size))
         }
     }
 }

+ 3 - 1
KdanAutoTest/KdanAuto/Class/Norrmal/Cell/TestCaseCellView.swift

@@ -178,7 +178,9 @@ class TestCaseCellView : NSTableCellView {
         if nil != files && files.count > 0 {
             let compareVC = CompareViewController.shared()
             compareVC.setFiles(files)
-            compareVC.showIn(sender)
+            
+            let point = sender.convert(NSPoint.zero, to: self.window?.contentView)
+            compareVC.showIn(self.window?.contentView, rect: NSRect.init(origin: point, size: sender.frame.size))
         }
         return
         

+ 45 - 2
KdanAutoTest/KdanAuto/Class/Tools/ImageProcess/ImageProcess.swift

@@ -11,7 +11,7 @@ import AppKit
 class ImageProcess : NSObject {
     
     //  Image compare
-    class func compareJPEG(_ resultPath:String, checkPath:String) -> Double {
+    class func compareJPEG(_ resultPath:String, checkPath:String, processCover:Bool) -> Double {
         if !FileManager.default.fileExists(atPath: resultPath) || !FileManager.default.fileExists(atPath: checkPath) {
             return -1
         }
@@ -75,6 +75,7 @@ class ImageProcess : NSObject {
             NSLog(String("识别到背景色\(bgColor)"))
         }
         
+        let data = NSMutableData.init(length: cWidth * cHeight * 4)
         // Compare
         let compareDifValue = DataModel.shared.comparativeDifference()
         var equalCount = 0 as Double
@@ -109,13 +110,55 @@ class ImageProcess : NSObject {
                         cColor.isEqual(to: bgColor) {
                         bgCount += 1
                     }
+                }else if (processCover && nil != data){
+                    let addr = cWidth * 4 * y + x * 4
+                    
+                    var r = uint8(255)
+                    data!.replaceBytes(in: NSRange.init(location: addr+0, length: 1), withBytes: &r)
+                    var g = uint8(255 * rColor.greenComponent/2)
+                    data!.replaceBytes(in: NSRange.init(location: addr+1, length: 1), withBytes: &g)
+                    var b = uint8(255 * rColor.blueComponent/2)
+                    data!.replaceBytes(in: NSRange.init(location: addr+2, length: 1), withBytes: &b)
+                    var a = uint8(255 * rColor.alphaComponent * 0.7)
+                    data!.replaceBytes(in: NSRange.init(location: addr+3, length: 1), withBytes: &a)
+                }
+            }
+        }
+        
+        let outDegree = Double(max(equalCount-bgCount, 1)/(max(Double(cWidth) * Double(cHeight)-bgCount, 1)) * 100.0)
+        if (abs(outDegree - 100) > 0 && processCover && nil != data) {
+            DispatchQueue.global().async {
+                let cfData = CFDataCreate(kCFAllocatorDefault, data?.bytes, data!.length)
+                let dataProvider = CGDataProvider.init(data: cfData!)
+                
+                let colorSpace = CGColorSpaceCreateDeviceRGB()
+                let cgImage = CGImage.init(width: cWidth,
+                                           height: cHeight,
+                                           bitsPerComponent: 8,
+                                           bitsPerPixel: 8 * 4,
+                                           bytesPerRow: cWidth * 4,
+                                           space: colorSpace,
+                                           bitmapInfo: CGBitmapInfo(rawValue: CGImageAlphaInfo.premultipliedLast.rawValue | CGBitmapInfo.byteOrderDefault.rawValue) ?? CGBitmapInfo.byteOrderDefault,
+                                           provider: dataProvider!,
+                                           decode: nil,
+                                           shouldInterpolate: true,
+                                           intent: CGColorRenderingIntent.defaultIntent)
+                
+                if nil != cgImage {
+                    let coverPath = NSString(format: "%@_cover.png", NSString(string: resultPath).deletingPathExtension) as! String
+                    let rep = NSBitmapImageRep.init(cgImage: cgImage!)
+                    
+                    if let saveData = rep.representation(using: .png, properties: [:]) {
+                        let url = URL.init(fileURLWithPath: coverPath, isDirectory: false)
+                        try? saveData.write(to: url)
+                    }
                 }
             }
         }
         
         NSLog(String("过滤点数目\(bgCount)"))
         
-        return Double(max(equalCount-bgCount, 1)/(max(Double(cWidth) * Double(cHeight)-bgCount, 1)) * 100.0)
+        return outDegree
     }
     
     //Genera Image

+ 2 - 0
KdanAutoTest/KdanAuto/ViewController.swift

@@ -202,6 +202,8 @@ class ViewController : NSViewController, SettingViewControllerDelegate, AutoTest
                 self.startBtn.title = "Start"
                 
                 self.replaceAllBtn.isEnabled = true
+                
+                TestDegreeManager.shared().saveInfo()
             }
         }
     }