2012-02-10 8 views
6

मैं घुमावदार आइकन को एक थंबनेल को एक त्वरित दृश्य प्लगइन में कैसे हटा सकता हूं?qlgenerator से कर्ल किए गए कोने को हटाएं थंबनेल

वर्तमान आइकन का स्क्रीनशॉट: enter image description here

जो मैं चाहता का स्क्रीनशॉट: enter image description here

GeneratePreviewForURL.m:

#include <CoreFoundation/CoreFoundation.h> 
#include <CoreServices/CoreServices.h> 
#include <QuickLook/QuickLook.h> 

#import "GenerateIcon.h" 

OSStatus GeneratePreviewForURL(void *thisInterface, QLPreviewRequestRef preview, CFURLRef url, CFStringRef contentTypeUTI, CFDictionaryRef options); 
void CancelPreviewGeneration(void *thisInterface, QLPreviewRequestRef preview); 

/* ----------------------------------------------------------------------------- 
    Generate a preview for file 

    This function's job is to create preview for designated file 
    ----------------------------------------------------------------------------- */ 

OSStatus GeneratePreviewForURL(void *thisInterface, QLPreviewRequestRef preview, CFURLRef url, CFStringRef contentTypeUTI, CFDictionaryRef options) 
{ 
    // To complete your generator please implement the function GeneratePreviewForURL in GeneratePreviewForURL.c 

    [GenerateIcon generatePreviewWithRef:preview URL:url]; 

    return noErr; 
} 

void CancelPreviewGeneration(void *thisInterface, QLPreviewRequestRef preview) 
{ 
    // Implement only if supported 
} 

GenerateIcon.m:

// 
// GenerateIcon.m 
// Windows Binary Icon 
// 
// Created by Asger Hautop Drewsen on 2/5/12. 
// Copyright (c) 2012 Asger Drewsen. All rights reserved. 
// 

#import "GenerateIcon.h" 

@implementation GenerateIcon 

+(void) generateThumbnailWithRef:(QLThumbnailRequestRef)requestRef URL:(CFURLRef)url 
{ 
    [GenerateIcon generateMultiWithThumbnailRef:requestRef PreviewRef:nil URL:url]; 
} 
+(void) generatePreviewWithRef:(QLPreviewRequestRef)requestRef URL:(CFURLRef)url 
{ 
    [GenerateIcon generateMultiWithThumbnailRef:nil PreviewRef:requestRef URL:url]; 
} 

    +(void) generateMultiWithThumbnailRef:(QLThumbnailRequestRef)thumbnail PreviewRef:(QLPreviewRequestRef)preview URL:(CFURLRef)url 
{ 
    @autoreleasepool { 

     NSString * tempDir = NSTemporaryDirectory(); 
     if (tempDir == nil) 
      tempDir = @"/tmp"; 

     NSFileManager *fileManager = [[NSFileManager alloc] init]; 

     NSString *directory = [tempDir stringByAppendingFormat: [NSString stringWithFormat:@"%@-%.0f", @"exe-icons", [NSDate timeIntervalSinceReferenceDate] * 1000.0]]; 

     //NSString *directory = [tempDir stringByAppendingPathComponent:@"com.tyilo.exe-icons"]; 

     /*for (NSString *file in [fileManager contentsOfDirectoryAtPath:directory error:nil]) 
     { 
     [fileManager removeItemAtPath:file error:nil]; 
     }*/ 

     [fileManager createDirectoryAtPath:directory withIntermediateDirectories:YES attributes:nil error:nil]; 

     [[NSTask launchedTaskWithLaunchPath:@"/usr/local/bin/wrestool" arguments:[NSArray arrayWithObjects: 
                        @"-t", 
                        @"group_icon", 
                        @"-o", 
                        directory, 
                        @"-x", 
                        [(__bridge NSURL *)url path], 
                        nil]] waitUntilExit]; 

     NSArray *icons = [fileManager contentsOfDirectoryAtPath:directory error:nil]; 

     if (icons.count > 0) 
     { 
      NSImage *image = [[NSImage alloc] initWithContentsOfFile:[directory stringByAppendingPathComponent: [icons objectAtIndex:0]]]; 
      NSData *thumbnailData = [image TIFFRepresentation]; 
      CGSize size = image.size; 
      NSDictionary *properties = [NSDictionary dictionaryWithObjectsAndKeys: 
             [NSNumber numberWithInt:size.width],kQLPreviewPropertyWidthKey, 
             [NSNumber numberWithInt:size.height],kQLPreviewPropertyHeightKey, 
             nil]; 
      CGContextRef CGContext; 
      if (thumbnail) 
      { 
       CGContext = QLThumbnailRequestCreateContext(thumbnail, size, TRUE, (__bridge CFDictionaryRef)properties); 
      } 
      else 
      { 
       CGContext = QLPreviewRequestCreateContext(preview, size, TRUE, (__bridge CFDictionaryRef)properties); 
      } 
      if(CGContext) { 
       NSGraphicsContext* context = [NSGraphicsContext graphicsContextWithGraphicsPort:(void *)CGContext flipped:size.width > size.height]; 
       if(context) { 
        //These two lines of code are just good safe programming… 
        [NSGraphicsContext saveGraphicsState]; 
        [NSGraphicsContext setCurrentContext:context]; 

        NSBitmapImageRep *thumbnailBitmap = [NSBitmapImageRep imageRepWithData:thumbnailData]; 
        [thumbnailBitmap draw]; 

        //This line sets the context back to what it was when we're done 
        [NSGraphicsContext restoreGraphicsState]; 
       } 

       // When we are done with our drawing code QLThumbnailRequestFlushContext() is called to flush the context 
       if (thumbnail) 
       { 
        QLThumbnailRequestFlushContext(thumbnail, CGContext); 
       } 
       else 
       { 
        QLPreviewRequestFlushContext(preview, CGContext); 
       } 

       // Release the CGContext 
       CFRelease(CGContext); 
      } 
      /*NSLog(@"%@", [directory stringByAppendingPathComponent: [icons objectAtIndex:0]]); 
      CGImageRef image = (__bridge CGImageRef) [[NSImage alloc] initByReferencingFile:[directory stringByAppendingPathComponent: [icons objectAtIndex:0]]]; 
      QLThumbnailRequestSetImage(thumbnail, image, properties);*/ 
     } 
     else 
     { 
      NSLog(@"Failed to generate thumbnail!"); 
     } 
    } 
} 

@end 

संपादित करें: जोड़ा गया स्क्रीनशॉट।

+0

क्या आपको इसके लिए कोई समाधान मिला? – Mark

+0

@ मार्क नो मैंने कभी नहीं किया। – Tyilo

उत्तर

0

त्वरित रूप से त्वरित रूप से आपके आइकन का पहलू स्वचालित रूप से चुना जाता है और इसे अनुकूलित करने का कोई सार्वजनिक तरीका नहीं है। आपका प्रकार अनुरूपता पेड़ क्या है?

यूटीआई पर अधिक जानकारी के लिए Uniform Type Identifiers Overview देखें। ध्यान दें कि आपका प्रकार अनुरूपता पेड़ जरूरी नहीं है कि आप त्वरित रूप से क्या चाहते हैं, लेकिन कम से कम आपके पास एक प्रारंभिक बिंदु होगा।

+1

मैं सिर्फ घुमावदार कोनों को हटाना चाहता हूं और मुझे नहीं पता कि आपने अभी क्या लिखा है – Tyilo

+0

त्वरित देखो द्वारा उत्पादित आइकन का पहलू आपके प्रकार की घोषणा से अनुमानित है (इसमें उदाहरण के लिए एक घुमावदार कोने डालने के लिए गीला शामिल है)। जब आप अपना यूटीआई घोषित करते हैं, तो आपको अपने प्रकार के अनुरूपता (यूटी टाइप टाइपफॉर्म) को निर्दिष्ट करने की आवश्यकता होती है। मेरा सवाल यह है कि: किस प्रकार का अपना प्रकार अनुरूप है? – Julien

+0

वर्तमान में यह 'public.item' के अनुरूप है, हालांकि यह केवल exe-files के साथ काम करता है। क्या मुझे इसे किसी और चीज़ में बदलना चाहिए? – Tyilo

5

मैं इस प्रश्न के लिए थोड़ा देर से आ रहा हूं!

आपको QLThumbnailRequestCreateContext() या QLThumbnailRequestSetXXX() को प्रदान करने वाले गुणों के लिए अनियंत्रित "आइकन फ्लेवर" कुंजी जोड़ने की आवश्यकता है, और इसे न्यूनतम सजावट के लिए मान 1 दें।

उदाहरण के लिए here देखें। उस फ़ाइल के शीर्ष पर कुछ अन्य मान हैं जिन्हें मैंने "IconFlavour" के लिए खोजा है।

+0

बिल्कुल सही! आप, महोदय, एक पदक का हकदार है। आपने यह कैसे खोजा? वैसे, kQLThumbnailIconPlainFlavor केक्यूएल थंबनेल IconShadowFlavor की तुलना में exe आइकनों के लिए बेहतर परिणाम था। – vitormm