2012-02-10 68 views
6

如何删除在quicklook插件中创建的缩略图的卷曲图标?从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 2014-11-13 14:59:34

+0

@Mark No我从来没有。 – Tyilo 2014-11-13 15:38:59

回答

0

你的图标的方面是由快速查看自动选择,没有公开的方式来定制它。你的类型一致性树是什么?请参阅Uniform Type Identifiers Overview。请注意,您的类型一致性树不一定会转换成您想要从Quick Look获得的内容,但至少您会有一个理智的起点。

+1

我只是想去除卷曲的角落,我不知道你刚刚写了什么 – Tyilo 2012-02-10 01:01:22

+0

Quick Look生成的图标的方面是从你的类型声明(这包括例如放置一个卷曲的角落)推断出来的。当你声明你的UTI时,你需要指定你的类型一致性(UTTypeConformsTo)。我的问题是:你自己的类型符合什么类型? – Julien 2012-02-10 01:14:05

+0

它目前符合'public.item',但它只适用于exe文件。我应该把它改成别的东西吗? – Tyilo 2012-02-10 01:16:28

5

我来这个问题有点迟了!

您需要添加无证“IconFlavor”键的属性字典,你提供给QLThumbnailRequestCreateContext()或QLThumbnailRequestSetXXX(),并给它一个最小的装饰价值1。

查看here举例。在该文件的顶部是我发现的“IconFlavour”的一些其他值。

+0

完美!你,先生,值得一枚奖牌。你是怎么发现的?顺便说一句,kQLThumbnailIconPlainFlavor对于exe图标比kQLThumbnailIconShadowFlavor有更好的结果。 – vitormm 2016-05-24 14:14:38