ทำไม CGImage ของฉันถึง 3 x ขนาดของ UIImage

ฉันมีฟังก์ชั่นที่ใช้ UIImage และสีและใช้เพื่อส่งคืน UIImage เป็นสีนั้น

เนื่องจากเป็นส่วนหนึ่งของฟังก์ชัน UIImage จะถูกแปลงเป็น CGImage แต่ด้วยเหตุผลบางอย่าง CGImage จึงมีขนาดใหญ่กว่า UIImage ถึง 3 เท่า ซึ่งหมายความว่าผลลัพธ์สุดท้ายคือ 3 เท่าของขนาดที่ควรเป็น

นี่คือฟังก์ชั่น

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
}

คุณจะเห็นได้ในสองสามบรรทัดแรกที่ฉันใช้ print() เพื่อพิมพ์ขนาดของแต่ละ UIImage และ CGImage ไปยังคอนโซล CGImage มีขนาดใหญ่เป็น 3 เท่าของ UIImage เสมอ... ฉันสงสัยว่ามันเกี่ยวข้องกับ @2x, @3x ฯลฯ หรือไม่

ดังนั้นคำถามคือเหตุใดจึงเกิดเหตุการณ์เช่นนี้ และจะทำอย่างไรเพื่อให้ได้ภาพที่มีขนาดเท่ากับขนาดที่ฉันเริ่มต้น


person 365SplendidSuns    schedule 11.03.2016    source แหล่งที่มา


คำตอบ (1)


เป็นเพราะ UIImage มีคุณสมบัติ scale ค่านี้เป็นสื่อกลางระหว่าง พิกเซล และ จุด ตัวอย่างเช่น UIImage ที่สร้างจากรูปภาพขนาด 180x180 พิกเซล แต่มี scale จาก 3 จะถือว่ามีขนาด 60x60 จุด โดยอัตโนมัติ โดยจะรายงานขนาดเป็น 60x60 และจะดูดีบนหน้าจอความละเอียด 3x โดยที่ 3 พิกเซลตรงกับ 1 จุด และตามที่คุณเดาได้ถูกต้อง คำต่อท้าย @3x หรือตำแหน่งที่เกี่ยวข้องในแค็ตตาล็อกสินทรัพย์ จะบอกระบบให้ให้ UIImage เป็น scale จาก 3 ในขณะที่สร้าง

แต่ CGImage ไม่มีคุณสมบัติดังกล่าว มันเป็นเพียงบิตแมป ซึ่งเป็นพิกเซลที่แท้จริงของภาพ ดังนั้น CGImage ที่สร้างจาก UIImage ที่สร้างจากรูปภาพขนาด 180x180 พิกเซล จึงมีขนาด 180x180 จุด เช่นกัน

person matt    schedule 11.03.2016
comment
และสำหรับข้อมูลเพิ่มเติมเกี่ยวกับหัวข้อนี้ โปรดดูหนังสือของฉัน: apeth.com/iOSBook/ch15.html #_cgimage_drawing ส่วนนั้นพูดถึงปัญหาของสิ่งที่ต้องทำเมื่อคุณวาด CGImage เพื่อหลีกเลี่ยงไม่ให้ออกมาในขนาดที่ไม่ถูกต้อง - person matt; 11.03.2016