2017-10-26 12 views
0

NSImageをPFFileとして解析するためにNSImageのサイズを変更しようとしています。データサイズを減らすために寸法を変更する必要がありますが、機能しません。サイズ変更された画像は、Swift内の幅と高さのサイズを変更しますが、元の画像と同じ寸法を維持します。Swift - OSX - NSImageデータのサイズを変更する

画像は2560 x 1706,721 KBのJPGです。

私はデータにそれを渡すと、それは私のコードである。ここ5.7メガバイト

に同じ寸法とGOSを保つ:

let fotoNSImage = NSImage(byReferencing: url) 

let fotoNSImageRedim = redimensionaNSImage(imagem: fotoNSImage, tamanho: NSSize(width: 200, height: 200)) 

let fotoNSImageRep = NSBitmapImageRep(data: (fotoNSImageRedim.tiffRepresentation)!) 

let fotoNSImagePng = fotoNSImageRep!.representation(using: NSBitmapImageRep.FileType.png, properties: [:]) 

let fotoProduto = FotoProduto(foto: PFFile(data: fotoNSImagePng!)!, categorias: []) 

・デ・イメージのサイズを変更する方法:

static func redimensionaNSImage(imagem: NSImage, tamanho: NSSize) -> NSImage { 

    var ratio: Float = 0.0 
    let imageWidth = Float(imagem.size.width) 
    let imageHeight = Float(imagem.size.height) 
    let maxWidth = Float(tamanho.width) 
    let maxHeight = Float(tamanho.height) 

    if (imageWidth > imageHeight) { 
     // Landscape 
     ratio = maxWidth/imageWidth; 
    } 
    else { 
     // Portrait 
     ratio = maxHeight/imageHeight; 
    } 

    // Calculate new size based on the ratio 
    let newWidth = imageWidth * ratio 
    let newHeight = imageHeight * ratio 

    // Create a new NSSize object with the newly calculated size 
    let newSize: NSSize = NSSize(width: Int(newWidth), height: Int(newHeight)) 

    // Cast the NSImage to a CGImage 
    var imageRect: CGRect = CGRect(x: 0, y: 0, width: Int(newWidth), height: Int(newHeight)) 
    let imageRef = imagem.cgImage(forProposedRect: &imageRect, context: nil, hints: nil) 

    // Create NSImage from the CGImage using the new size 
    let imageWithNewSize = NSImage(cgImage: imageRef!, size: newSize) 

    // Return the new image 
    return imageWithNewSize 
} 

私はすでに成功せずに次のアプローチを試みてきました。

1 - fotoNSImagePngに直接pixelWideとpixelHighを変更します。このアプローチに従ってください: - -

let rep = NSBitmapImageRep(bitmapDataPlanes: nil, 
          pixelsWide: 200, 
          pixelsHigh: 133, 
          bitsPerSample: 8, 
          samplesPerPixel: 4, 
          hasAlpha: true, 
          isPlanar: false, 
          colorSpaceName: NSDeviceRGBColorSpace, 
          bytesPerRow: Int(newSize.width * 4), 
          bitsPerPixel: 32) 

3: を

fotoNSImageRep?.pixelsWide = 200 
fotoNSImageRep?.pixelsHigh = 133 

2新しいNSBitmapImageRepを作成し、それに画像表現を置き換えますHow to resize - resample - change file size - NSImage

4 - NSBitmapImageRepサイズの値を変更します。

fotoNSImageRep?.size.width = 200 
fotoNSImageRep?.size.height = 133 

これまでのところ何も働いていません。

答えて

0

I画像のサイズを変更する方法を変更した

static func redimensionaNSImage(imagem: NSImage, tamanho: NSSize) -> NSImage { 

    var ratio: Float = 0.0 
    let imageWidth = Float(imagem.size.width) 
    let imageHeight = Float(imagem.size.height) 
    let maxWidth = Float(tamanho.width) 
    let maxHeight = Float(tamanho.height) 

    // Get ratio (landscape or portrait) 
    if (imageWidth > imageHeight) { 
     // Landscape 
     ratio = maxWidth/imageWidth; 
    } 
    else { 
     // Portrait 
     ratio = maxHeight/imageHeight; 
    } 

    // Calculate new size based on the ratio 
    let newWidth = imageWidth * ratio 
    let newHeight = imageHeight * ratio 

    let imageSo = CGImageSourceCreateWithData(imagem.tiffRepresentation! as CFData, nil) 
    let options: [NSString: NSObject] = [ 
     kCGImageSourceThumbnailMaxPixelSize: max(imageWidth, imageHeight) * ratio as NSObject, 
     kCGImageSourceCreateThumbnailFromImageAlways: true as NSObject 
    ] 
    let size1 = NSSize(width: Int(newWidth), height: Int(newHeight)) 
    let scaledImage = CGImageSourceCreateThumbnailAtIndex(imageSo!, 0, options as CFDictionary).flatMap { 
     NSImage(cgImage: $0, size: size1) 
    } 

    return scaledImage! 
} 
関連する問題