Изменение размера изображений с высоким разрешением с размером 1000x1000 пикселей, когда для размера установлено значение 500x500 пикселей - PullRequest
0 голосов
/ 01 июня 2018

Я использую следующий метод расширения для изменения размера изображения. Когда дело доходит до изображений с большим разрешением, размер вывода остается 1000x1000 пикселей, даже если я устанавливаю размер вывода 500x500 пикселей

extension NSImage {
    func resizeImage(width: CGFloat, _ height: CGFloat) -> NSImage {
        let img = NSImage(size: CGSize(width:width, height:height))

        img.lockFocus()
        let ctx = NSGraphicsContext.current
        ctx?.imageInterpolation = .high
        self.draw(in: NSMakeRect(0, 0, width, height), from: NSMakeRect(0, 0, size.width, size.height), operation: .copy, fraction: 1)
        img.unlockFocus()

        return img
    }

Что я делаюнеправильно?Пожалуйста, совет

ОБНОВЛЕНИЕ:

//SAVING 



for x in fileArray  {


            var image = NSImage(contentsOf:x)!
            let imageURL=outdir+"/"+"xxx"
            image=image.resizeImage(width: CGFloat(rwidth), CGFloat(rheight))
            saveimage(xdata: image, imageURL: imageURL, format: fileformat)

            }

func saveimage(xdata:NSImage,imageURL:String,format:String) -> Bool
    {


        let bMImg = NSBitmapImageRep(data: (xdata.tiffRepresentation)!)
        switch format {
        case ".png":
            let filepath=URL(fileURLWithPath: imageURL+".png")
            let dataToSave = bMImg?.representation(using: NSBitmapImageRep.FileType.png, properties: [NSBitmapImageRep.PropertyKey.compressionFactor : 1])
            do
            {
                try  dataToSave?.write(to: filepath)
                return true

            } catch
            {
                return false
            }
        case ".jpg":
            let filepath=URL(fileURLWithPath: imageURL+".jpg")
             let dataToSave = bMImg?.representation(using: NSBitmapImageRep.FileType.jpeg, properties: [NSBitmapImageRep.PropertyKey.compressionFactor : 1])
            do
            {
                try  dataToSave?.write(to:filepath)
                return true

            } catch
            {
               return false
            }
        case ".tif":
            let filepath=URL(fileURLWithPath: imageURL+".tif")
            let dataToSave = bMImg?.representation(using: NSBitmapImageRep.FileType.tiff, properties: [NSBitmapImageRep.PropertyKey.compressionFactor : 1])
            do
            {
                try  dataToSave?.write(to:filepath)
                return true

            } catch
            {
                return false
            }
        case ".bmp":
            let filepath=URL(fileURLWithPath: imageURL+".bmp")
            let dataToSave = bMImg?.representation(using: NSBitmapImageRep.FileType.bmp, properties: [NSBitmapImageRep.PropertyKey.compressionFactor : 1])
            do
            {
                try  dataToSave?.write(to:filepath)
                return true

            } catch
            {
                return false
            }
        case ".gif":
             let filepath=URL(fileURLWithPath: imageURL+".gif")
            let dataToSave = bMImg?.representation(using: NSBitmapImageRep.FileType.gif, properties: [NSBitmapImageRep.PropertyKey.compressionFactor : 1])
            do
            {
                try  dataToSave?.write(to:filepath)
                return true

            } catch
            {
                return false
            }

        default:

            return true
        }

    }

1 Ответ

0 голосов
/ 01 июня 2018

Проблема в том, что вы не учитываете масштаб создаваемого изображения.

У вас есть экран Retina.Когда вы вызываете lockFocus и рисуете в результирующем графическом контексте, графический контекст имеет двойное разрешение.Таким образом, размер 500x500 приводит к базовому растровому изображению 1000x1000.Это не имеет значения для целей отображения;в той мере, в которой это имеет значение, это хорошо.

Но когда вы продолжаете сохранять данные изображения на диск, вы выбрасываете знание, что это изображение с двойным разрешением, и вы просто сохраняетерастровое изображение - 1000x1000.

Вам следует ознакомиться с документацией Apple о том, как работать с изображениями с высоким разрешением, например https://developer.apple.com/library/content/documentation/GraphicsAnimation/Conceptual/HighResolutionOSX/APIs/APIs.html

.
...