2012-02-10 13 views
6

Come rimuovere l'icona arricciata come miniatura in un plug-in di quicklook?Rimuovere l'angolo arricciato da qlgenerator thumbnail

Schermata di icona corrente: enter image description here

Schermata di ciò che voglio: 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 

Edit: Aggiunto screenshot.

+0

Hai trovato una soluzione per questo? – Mark

+0

@ Marco No, non l'ho mai fatto. – Tyilo

risposta

0

L'aspetto delle icone viene scelto automaticamente da Quick Look e non esiste un modo pubblico per personalizzarlo. Qual è il tuo tipo albero di conformità?

Per ulteriori informazioni su UTI vedere Uniform Type Identifiers Overview. Si noti che l'albero di conformità del tipo non si tradurrà necessariamente in quello che si desidera da Quick Look ma almeno si avrà un punto di partenza sano.

+1

Voglio solo rimuovere gli angoli arricciati e non ho idea di cosa hai appena scritto – Tyilo

+0

L'aspetto delle icone prodotto da Quick Look è dedotto dalla dichiarazione del tuo tipo (questo include, ad esempio, l'inserimento di un angolo arricciato, ad esempio). Quando si dichiara l'UTI, è necessario specificare la conformità del tipo (UTTypeConformsTo). La mia domanda è: a quali tipi è conforme il tuo tipo? – Julien

+0

Attualmente è conforme a 'public.item', tuttavia funziona solo con file exe. Dovrei cambiarlo in qualcos'altro? – Tyilo

5

Sto arrivando un po 'in ritardo a questa domanda!

È necessario aggiungere la chiave "IconFlavor" non documentata al dizionario delle proprietà che si fornisce a QLThumbnailRequestCreateContext() o QLThumbnailRequestSetXXX() e assegnargli il valore 1 per la decorazione minima.

Vedere here per un esempio. Nella parte superiore di quel file ci sono altri valori che ho scoperto per "IconFlavour".

+0

Perfetto! Lei, signore, merita una medaglia. Come l'hai scoperto? A proposito, kQLThumbnailIconPlainFlavor ha avuto un risultato migliore per le icone exe di kQLThumbnailIconShadowFlavor. – vitormm