Mengapa CGImage saya berukuran 3x dari UIImage

Saya memiliki fungsi yang mengambil UIImage dan warna dan menggunakannya untuk mengembalikan UIImage hanya dalam warna itu.

Sebagai bagian dari fungsinya, UIImage diubah menjadi CGImage tetapi karena alasan tertentu ukuran CGImage adalah 3 kali lipat dari UIImage yang berarti hasil akhirnya adalah 3 kali dari ukuran yang seharusnya.

Inilah fungsinya

func coloredImageNamed(name: String, color: UIColor) -> UIImage {

    let startImage: UIImage = UIImage(named: name)!
    print("UIImage W: \(startImage.size.width) H\(startImage.size.height)")

    let maskImage: CGImage = startImage.CGImage!
    print("CGImage W: \(CGImageGetWidth(maskImage)) H\(CGImageGetHeight(maskImage))")

    // Make the image that the mask is applied to (Just a rectangle of the color want to use)
    let colorImageSize: CGSize = CGSizeMake(startImage.size.width, startImage.size.height)
    let colorFillImage: CGImage = getImageWithColor(color, size: colorImageSize).CGImage!

    // Make the mask image into a mask
    let mask: CGImage = CGImageMaskCreate(CGImageGetWidth(maskImage),
        CGImageGetHeight(maskImage),
        CGImageGetBitsPerComponent(maskImage),
        CGImageGetBitsPerPixel(maskImage),
        CGImageGetBytesPerRow(maskImage),
        CGImageGetDataProvider(maskImage), nil, false)!

        // Create the new image and convert back to UIImage, then return
        let masked: CGImage! = CGImageCreateWithMask(colorFillImage, mask);
        let returnImage: UIImage! = UIImage(CGImage: masked)
     return returnImage
}

Anda dapat melihat di beberapa baris pertama saya menggunakan print() untuk mencetak ukuran masing-masing UIImage dan CGImage ke konsol. CGIimage selalu berukuran 3 kali lipat dari UIImage... Saya curiga ini ada hubungannya dengan @2x, @3x dll?

Jadi pertanyaannya adalah mengapa ini terjadi dan apa yang bisa dilakukan untuk mendapatkan Gambar yang ukurannya sama dengan yang saya mulai?


person 365SplendidSuns    schedule 11.03.2016    source sumber


Jawaban (1)


Itu karena UIImage memiliki properti scale. Ini menjadi perantara antara piksel dan titik. Jadi, misalnya, UIImage yang dibuat dari gambar piksel 180x180, tetapi dengan scale dari 3, secara otomatis dianggap memiliki titik berukuran 60x60. Ini akan melaporkan ukurannya sebagai 60x60, dan juga akan terlihat bagus pada layar beresolusi 3x di mana 3 piksel sama dengan 1 poin. Dan, seperti yang Anda tebak dengan benar, akhiran @3x, atau lokasi terkait di katalog aset, memberitahu sistem untuk memberikan UIImage scale dari 3 saat sistem membentuknya.

Namun CGIimage tidak memiliki properti seperti itu; itu hanya bitmap, piksel sebenarnya dari gambar. Jadi CGIimage yang dibentuk dari UIImage yang dibuat dari gambar piksel 180x180 adalah titik 180x180 juga.

person matt    schedule 11.03.2016
comment
Dan untuk informasi lebih lanjut tentang topik ini, lihat buku saya: apeth.com/iOSBook/ch15.html #_cgimage_drawing Bagian itu membahas tentang apa yang harus dilakukan saat Anda menggambar CGIimage agar ukurannya tidak salah. - person matt; 11.03.2016