Thay đổi kích thước hình ảnh css

Có nhiều cách để thay đổi kích thước hình ảnh nhưng không phải ai cũng biết hết. Thế nên chúng tôi đã tổng hợp đầy đủ các kỹ thuật thay đổi kích thước hình ảnh chính xác và dễ hiểu mà ai cũng có thể làm được. Cùng xem ngay thôi

Thay đổi kích thước hình ảnh css

Vì sao phải chia tỷ lệ hình ảnh?

– Chúng ta cần chia tỷ lệ hình ảnh khi mà ảnh mà chúng ta cần hiển thị có kích thước nhỏ hơn so với ảnh chúng ta có được

– UIImageView tỷ lệ tự động và cắt hình ảnh theo trình tự đã được định sẵn thuộc tính contentMode bờ bời và trong các trường hợp. quy môAspectFit,. scaleAspectFill, hoặc. quy môToFill

imageView.contentMode = .scaleAspectFit

imageView.image = image

ĐẬP

– Kỹ thuật này được biết đến như là downsampling và nó có thể cải thiện rất nhiều tính năng của ứng dụng trong trường hợp sử dụng nó

– Ngày nay một số ứng dụng có thể tải những tấm ảnh lớn mà không khác với ảnh gốc. Để thực hiện được công việc này, cùng tham khảo 1 số phương pháp thay đổi kích thước nhé

Những kỹ thuật thay đổi kích thước hình ảnh

Thay đổi kích thước hình ảnh css

Có nhiều cách khác nhau để có thể thay đổi kích thước hình ảnh, mỗi cách khác nhau mang đến những hiệu năng khác nhau. Chúng ta có thể tìm kiếm các cách thức này ở cấp thấp/cấp cao từ Core Graphics, vImage, Image I/O, Core Graphics và cả UIKit

Tuy nhiên, to nhất quán, mỗi một kỹ thuật sau sẽ sử dụng chung 1 mẫu

func resizedImage(at url: URL, for size: CGSize) -> UIImage? { .. }

imageView.image = resizedImage(at: url, for: size)

Ở đây, kích thước là cách đo kích thước điểm thay vì sử dụng kích thước pixel. Để tính toán pixel-size cho việc scale, resizing size chúng ta sử dụng scale of UIScreen

let scaleFactor = UIScreen.main.scale

let scale = CGAffineTransform(scaleX: scaleFactor, y: scaleFactor)

let size = imageView.bounds.size.applying(scale)

Nếu bạn đang tải không đồng bộ 1 tấm ảnh, hãy sử dụng quá trình chuyển đổi để có tấm ảnh mờ trước trong chế độ xem hình ảnh. Ví dụ

class ViewController: UIViewController {

@IBOutlet var imageView: UIImageView!




override func viewWillAppear(_ animated: Bool) {

super.viewWillAppear(animated)




let url = Bundle.main.url(forResource: "Blue Marble West",

withExtension: "tiff")!




DispatchQueue.global(qos: .userInitiated).async {

let image = resizedImage(at: url, for: self.imageView.bounds.size)




DispatchQueue.main.sync {

UIView.transition(with: self.imageView,

duration: 1.0,

options: [.curveEaseOut, .transitionCrossDissolve],

animations: {

self.imageView.image = image

})

}

}

}

}

Sử dụng UIGraphicsImageRenderer

API cấp cao nhất hỗ trợ việc thay đổi kích thước trong UIKit framework. UIImage cho phép bạn có thể vẽ trong ngữ cảnh UIGraphicsImageRenderer để kết xuất và thu nhỏ bức ảnh

import UIKit




// Technique #1

func resizedImage(at url: URL, for size: CGSize) -> UIImage? {

guard let image = UIImage(contentsOfFile: url.path) else {

return nil

}




let renderer = UIGraphicsImageRenderer(size: size)

return renderer.image { (context) in

image.draw(in: CGRect(origin: .zero, size: size))

}

}

UIGraphicsImageRenderer là một API tương đối mới được giới thiệu trong iOS10 để thay thế cho những API UIGraphicsBeginImageContextWithOptions / UIGraphicsEndImageContext. You build UIGraphicsImageRenderer bằng point-size. Hình ảnh phương pháp sẽ tạo 1 lần đóng và trả về kết quả của các bitmap từ lần đóng. Trong trường hợp này, kết quả trả về là bức ảnh gốc được thu nhỏ lại trong giới hạn chỉ định

UIGraphicsImageRenderer hữu ích trong công việc thu nhỏ kích thước cấm đầu bức ảnh để phù hợp với khung ảnh hiển thị mà không thay đổi tỷ lệ gốc. AVMakeRect(tỷ lệ khung hình. bên trongRect. ) là chức năng trong AVFoundation  nhiệm vụ tính toán này cho bạn

import func AVFoundation.AVMakeRect

let rect = AVMakeRect(aspectRatio: image.size, insideRect: imageView.bounds)

Use Core Graphics

Thay đổi kích thước hình ảnh css

Core Graphics / Quartz 2D là API cấp thấp hơn cho phép chúng ta có nhiều tùy chỉnh cá nhân hơn

Chúng ta sẽ có CGImage, một context bitmap tạm thời được sử dụng để hiển thị các bức ảnh đã được chia tỷ lệ bằng phương pháp draw(_ in. …)

import UIKit

import CoreGraphics




// Technique #2

func resizedImage(at url: URL, for size: CGSize) -> UIImage? {

guard let imageSource = CGImageSourceCreateWithURL(url as NSURL, nil),

let image = CGImageSourceCreateImageAtIndex(imageSource, 0, nil)

else {

return nil

}




let context = CGContext(data: nil,

width: Int(size.width),

height: Int(size.height),

bitsPerComponent: image.bitsPerComponent,

bytesPerRow: image.bytesPerRow,

space: image.colorSpace ?? CGColorSpace(name: CGColorSpace.sRGB)!,

bitmapInfo: image.bitmapInfo.rawValue)

context?.interpolationQuality = .high

context?.draw(image, in: CGRect(origin: .zero, size: size))




guard let scaledImage = context?.makeImage() else { return nil }




return UIImage(cgImage: scaledImage)

}

CGContext khởi tạo yêu cầu một số đối số để tạo ngữ cảnh, bao gồm các tham số kích thước và dung lượng bộ nhớ cho mỗi kênh với các khoảng màu. Trong ví dụ này, các tham số được lấy từ đối tượng CGImage

Tiếp theo, việc thiết lập thuộc tính interpolationQuality thành. cao để suy giảm nội dung cho các pixel ảnh được hiển thị trung thực, Method** draw(_. in**) sẽ vẽ lại hình ảnh được cung cấp kích thước và vị trí, cho phép bức ảnh được cắt và cắt các góc cạnh để phù hợp với đặc điểm yêu cầu hiển thị. Cuối cùng, phương thức makeImage() sẽ truyền các thông tin từ ngữ cảnh phù hợp với việc kết xuất nó cho CGImage

Use Image I/O

I/O hình ảnh là 1 khung mạnh mẽ để làm việc với hình ảnh. Nó hoạt động độc lập với Core Graphics, nó có thể đọc và ghi giữ các định dạng khác nhau, các loại dữ liệu ảnh khác nhau và tiến trình xử lý các phương thức xử lý ảnh thông thường

Framework này cho phép các bộ mã hóa hình thức và bộ giải mã nhanh nhất với các cơ chế bộ nhớ đệm nâng cao, thậm chí có khả năng tải từng hình ảnh

Một lưu ý quan trọng là CGImageSourceCreateThumbnailAtIndex cung cấp API rút gọn với các lựa chọn khác nhau tỏ ra hữu dụng hơn với thứ được cung cấp trong CoreGraphics

import ImageIO




// Technique #3

func resizedImage(at url: URL, for size: CGSize) -> UIImage? {

let options: [CFString: Any] = [

kCGImageSourceCreateThumbnailFromImageIfAbsent: true,

kCGImageSourceCreateThumbnailWithTransform: true,

kCGImageSourceShouldCacheImmediately: true,

kCGImageSourceThumbnailMaxPixelSize: max(size.width, size.height)

]




guard let imageSource = CGImageSourceCreateWithURL(url as NSURL, nil),

let image = CGImageSourceCreateThumbnailAtIndex(imageSource, 0, options as CFDictionary)

else {

return nil

}




return UIImage(cgImage: image)

}

Chúng ta có CGImageSource để có thể đặt các tùy chọn tùy chọn, chức năng CGImageSourceCreateThuumbailAtlndex để tạo hình thu nhỏ của bức ảnh để chúng ta có thể xem trước. Việc thay đổi kích thước hoàn thành bởi kCGImageSourceThumbnailMaxPixelSize với kích thước tối đa được sử dụng để chia tỷ lệ bức hình theo hình ảnh gốc

Với việc cài đặt kCGImageSourceCreateThumbnailFromImageIfAbsent hoặc kCGImageSourceCreateThumbnailFromImageAlways, Image I/O bộ đệm tự động và chia tỷ lệ kết quả cho lần sử dụng tiếp theo

Use Core Image

Thay đổi kích thước hình ảnh css

Core Image được xây dựng trên các chức năng bằng cách lọc các ClLanczosScaleTransform có tên giống nhau. Mặc dù được cho là API cao cấp hơn của UIKit, việc sử dụng mã hóa khóa-giá trị trong Core Image làm cho nó khó sử dụng

Quá trình tạo bộ lọc để chuyển đổi, định cấu hình và hiển thị cho các bức ảnh không khác với quy trình của các API khác

________số 8_______

Hình ảnh lõi lọc các bộ phận có tên CILanczosScaleTransform trong tham số là inputImage, inputScale và inputAspectRatio

Vị trí thú vị hơn là một CIContext được sử dụng để tạo UIImage bằng đại diện trung gian là CGImageRef

With UIImage(CIImage. ) không thường làm việc như mong đợi, tạo ra CIContext là một cách thay thế. Bộ đệm ẩn được sử dụng nhiều lần trong quá trình thay đổi kích thước

Use vImage

Thay đổi kích thước hình ảnh css

Kỹ thuật cuối cùng là tỷ lệ hình ảnh với vImage với các chức năng để chia tỷ lệ hình ảnh. Các API cấp thấp hơn này hứa hẹn cho hiệu năng cao so với ít công đoạn yêu cầu. Ngoại trừ việc bạn phải quản lý các phần đệm bằng tay. (cười lớn)

import UIKit

import Accelerate.vImage




// Technique #5

func resizedImage(at url: URL, for size: CGSize) -> UIImage? {

// Decode the source image

guard let imageSource = CGImageSourceCreateWithURL(url as NSURL, nil),

let image = CGImageSourceCreateImageAtIndex(imageSource, 0, nil),

let properties = CGImageSourceCopyPropertiesAtIndex(imageSource, 0, nil) as? [CFString: Any],

let imageWidth = properties[kCGImagePropertyPixelWidth] as? vImagePixelCount,

let imageHeight = properties[kCGImagePropertyPixelHeight] as? vImagePixelCount

else {

return nil

}




// Define the image format

var format = vImage_CGImageFormat(bitsPerComponent: 8,

bitsPerPixel: 32,

colorSpace: nil,

bitmapInfo: CGBitmapInfo(rawValue: CGImageAlphaInfo.first.rawValue),

version: 0,

decode: nil,

renderingIntent: .defaultIntent)




var error: vImage_Error




// Create and initialize the source buffer

var sourceBuffer = vImage_Buffer()

defer { sourceBuffer.data.deallocate() }

error = vImageBuffer_InitWithCGImage(&sourceBuffer,

&format,

nil,

image,

vImage_Flags(kvImageNoFlags))

guard error == kvImageNoError else { return nil }




// Create and initialize the destination buffer

var destinationBuffer = vImage_Buffer()

error = vImageBuffer_Init(&destinationBuffer,

vImagePixelCount(size.height),

vImagePixelCount(size.width),

format.bitsPerPixel,

vImage_Flags(kvImageNoFlags))

guard error == kvImageNoError else { return nil }




// Scale the image

error = vImageScale_ARGB8888(&sourceBuffer,

&destinationBuffer,

nil,

vImage_Flags(kvImageHighQualityResampling))

guard error == kvImageNoError else { return nil }




// Create a CGImage from the destination buffer

guard let resizedImage =

vImageCreateCGImageFromBuffer(&destinationBuffer,

&format,

nil,

nil,

vImage_Flags(kvImageNoAllocate),

&error)?.takeRetainedValue(),

error == kvImageNoError

else {

return nil

}




return UIImage(cgImage: resizedImage)

}

Tăng tốc các API được sử dụng ở đây rất khó sử dụng trong quá trình phát triển khai thác so với các phương thức điều chỉnh lại phương thức khác. Bỏ qua việc đặt tên hàng và biến khó đọc bạn sẽ thấy phương thức phát triển khai báo này thì cách tiếp cận này cũng dễ để tìm hiểu

– Đầu tiên. tạo bộ nhớ đệm cho bức ảnh

– Thứ 2. tạo đường dẫn cho các bộ nhớ đệm này

– Thứ 3. valid data chia cho bức ảnh trong bộ đệm đến đường dẫn đã được định nghĩa

- Cuối cùng. Mount back a image with data is results in the source buffer

Kết luận

  • UIKit, Core Graphics, Image I/O đều hoạt động tốt trên các phương thức mở rộng quy mô ở hầu hết các bức ảnh. Nếu bạn sử dụng iOS, UIGraphicsImageRenderer là sự lựa chọn hàng đầu mà bạn nên cân nhắc
  • Core Image là sự lựa chọn tốt cho hiệu năng. Trên thực tế, bạn nên sử dụng CoreGraphics hoặc Hình ảnh/IO để cắt hoặc lấy mẫu xuống thay vì sử dụng Hình ảnh lõi
  • Ngoại trừ khi bạn thực sự có sẵn tính năng bắt đầu với vImage, công việc bổ sung để có thể sử dụng API là không cần thiết trong đa số trường hợp

Mong rằng những thông tin về kỹ thuật Resizing Image trên đây của Blog. kdata sẽ giúp bạn đọc thực hiện thành công và dễ dàng