Какао, цель-c, как изменить размер png-изображения?

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

- (void)scaleIcons:(NSString *)outputPath{
NSImage *anImage;
NSSize imageSize;
NSString *finalPath;

anImage = [self image];

imageSize = [anImage size];
imageSize.width = 512;
imageSize.height = 512;
[anImage setSize:imageSize];

finalPath = [outputPath stringByAppendingString:@"/icon_512x512.png"];

NSData *imageData = [anImage TIFFRepresentation];
NSBitmapImageRep *rep = [NSBitmapImageRep imageRepWithData:imageData];
NSData *dataToWrite = [rep representationUsingType:NSPNGFileType properties:nil];
[dataToWrite writeToFile:finalPath atomically:NO];
}

все работает, за исключением того, что мои изображения не масштабируются. Может кто-то немного помочь?

5
nl ja de

3 ответы

Таким образом, ваш фрагмент кода опускает операции, необходимые для масштабирования/преобразования изображения. Передайте изображение с помощью метода, такого как этот, прежде чем пытаться его сохранить:

- (NSImage *)scaleImage:(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;

      if (widthFactor < heightFactor)
      {
        thumbnailPoint.y = (targetHeight - scaledHeight) * 0.5;
      }

      else if (widthFactor > heightFactor)
      {
        thumbnailPoint.x = (targetWidth - scaledWidth) * 0.5;
      }

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

    [newImage lockFocus];

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

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

    [newImage unlockFocus];
  }

  return newImage;
}

Если вы интегрируете это в свой существующий метод:

- (void)scaleIcons:(NSString *)outputPath{

    NSSize outputSize = NSMakeSize(512.0f,512.0f);
    NSImage *anImage  = [self scaleImage:[self image] toSize:outputSize];

    NSString *finalPath = [outputPath stringByAppendingString:@"/icon_512x512.png"];
    NSData *imageData = [anImage TIFFRepresentation];
    NSBitmapImageRep *rep = [NSBitmapImageRep imageRepWithData:imageData];
    NSData *dataToWrite = [rep representationUsingType:NSPNGFileType properties:nil];
   [dataToWrite writeToFile:finalPath atomically:NO];
}
6
добавлено
NSMakeSize - это то, что вы хотите. NSSizeFromString сделает кучу ненужного синтаксического анализа строк.
добавлено автор Catfish_Man, источник
Обновленный ответ, ошибка связана с тем, что большая часть моего опыта связана с Cocoa Touch (где вы бы назвали CGSizeMake (ширина, высота)) ... Надеюсь, что это сработает для вас!
добавлено автор isaac, источник
Спасибо за один из самых объяснительных ответов! Просто нужно было изменить эту строку: NSSize outputSize = NSSizeMake (512.0f, 512.0f); с этим: NSSize outputSize = NSSizeFromString (@ "{512,512}");
добавлено автор Rokas, источник

Что касается ответа Параг Бафны, то для изменения размера он должен быть «resample» вместо «crop»:

sips --resampleHeightWidth 10 10 input.png --out output.png
2
добавлено

Вы также можете использовать команду sips (скриптовая система обработки изображений).

sips --cropToHeightWidth 10 10 input.png --out output.png
0
добавлено
Имя этой команды предполагает, что она переводит изображение (обрезая пиксели, которые не находятся внутри выбранной области), вместо того, чтобы изменять его размер.
добавлено автор Duncan C, источник