2015-01-04 10 views
0

Я использую этот код для масштабирования изображения, все работает отлично, но полученное изображение имеет прозрачность в его свойствах, и мне просто нужно изображение без прозрачных пленок и альфа-каналов на всех ... Кто-нибудь знает, как я могу изменить свой код, чтобы получить изображение без прозрачных пленок? Вот мой код:В какао, как масштабировать NSImage без прозрачности

- (void)scalePreviews:(NSString *)outputPath :(NSURL *)nomeImmagine :(CGFloat)size1 :(CGFloat)size2 :(NSString *)nomeIcona 
{ 
NSImage *image = [[NSImage alloc] initWithContentsOfFile:[nomeImmagine path]]; 
if (!image) 
    image = [[NSWorkspace sharedWorkspace] iconForFile:[nomeImmagine path]]; 


NSSize outputSize = NSMakeSize(size1,size2); 
NSImage *anImage = [self scaleImagePreviews:image toSize:outputSize]; 


NSString *finalPath = [outputPath stringByAppendingString:[NSString stringWithFormat:@"/image-previews/%@",nomeIcona]]; 

//questo serve a creare la directory delle icone se gia' non esiste 
NSFileManager *fileManager= [NSFileManager defaultManager]; 
if(![fileManager fileExistsAtPath:[outputPath stringByAppendingString:@"/image-previews"] isDirectory:nil]) 
    if(![fileManager createDirectoryAtPath:[outputPath stringByAppendingString:@"/image-previews"] withIntermediateDirectories:YES attributes:nil error:NULL]) 
     NSLog(@"Error: Create folder failed %@", [outputPath stringByAppendingString:@"/image-previews"]); 

// NSLog(@"finalPath: %@",finalPath); 
NSData *imageData = [anImage TIFFRepresentation]; 

NSBitmapImageRep *rep = [NSBitmapImageRep imageRepWithData:imageData]; 

NSData *dataToWrite = [rep representationUsingType:NSPNGFileType properties:nil]; 

[dataToWrite writeToFile:finalPath atomically:NO]; 


} 





- (NSImage *)scaleImagePreviews:(NSImage *)image toSize:(NSSize)targetSize 
{ 
     if ([image isValid]) 
     { 

      NSSize imageSize = [image size]; 
     float width = imageSize.width; 
     float height = imageSize.height; 
     float targetWidth = targetSize.width; 
     float targetHeight = targetSize.height; 
     float scaleFactor = 0.0; 
     float scaledWidth = targetWidth; 
     float scaledHeight = targetHeight; 

     NSPoint thumbnailPoint = NSZeroPoint; 

     if (!NSEqualSizes(imageSize, targetSize)) 
     { 
      float widthFactor = targetWidth/width; 
      float heightFactor = targetHeight/height; 

      if (widthFactor < heightFactor) 
      { 
       scaleFactor = widthFactor; 
      } 
      else 
      { 
       scaleFactor = heightFactor; 
      } 

      scaledWidth = width * scaleFactor; 
      scaledHeight = height * scaleFactor; 

      newImage = [[NSImage alloc] initWithSize:targetSize]; 

      [newImage lockFocus]; 

      NSRect thumbnailRect; 
      thumbnailRect.origin = thumbnailPoint; 
      thumbnailRect.size.width = targetSize.width; //scaledWidth; 
      thumbnailRect.size.height = targetSize.height; //scaledHeight; 

      [image drawInRect:thumbnailRect 
        fromRect:NSZeroRect 
        operation:NSCompositeSourceOver 
        fraction:1.0]; 

      [newImage unlockFocus]; 
     } 

} 

return newImage; 

} 
+0

Что вы подразумеваете под "прозрачностью в своих свойствах"? Какой цвет вы хотели бы использовать в местах, где исходное изображение является прозрачным? Вы пытались просто заполнить прямоугольник этим цветом, прежде чем рисовать исходное изображение? например '[[NSColor whiteColor] set]; NSRectFill (thumbnailRect); ' –

+0

Я попытался использовать ваш код, но у меня все еще есть эта проблема ... С« прозрачностью в своих свойствах »я имею в виду также, если изображение не имеет прозрачности, когда я использую его на сайте, который принимает только изображения без прозрачных пленок и без альфа-каналов. Я получаю сообщение об ошибке, заявив, что он нашел прозрачные пленки ... поэтому я думаю, что это должно быть в его «ДНК» ... Я не знаю, как ... Я также заметил, что если я открою изображение с Photoshop и я даю команду «сгладить изображение», проблема исчезает ... – Blue

ответ

0

Я нашел решение ... Я изменил representationUsingType ... Я JPEGFileType так что изображение не имеет прозрачных пленок на всех ...

здесь измененный код:

NSData * dataToWrite = [представительство repUsingType: NSJPEGFileType properties: nil];

 Смежные вопросы

  • Нет связанных вопросов^_^