Swift - 根据图片URL获取图片的大小

简介: Swift - 根据图片URL获取图片的大小

该方法在swift3以后会报大量的错,博主会在近期针对swift3.0进行更正


在swift3.0中,可以下载下来后再用,方法有多种,殊途同归,都是要先下载的,这里提供两种:

方法1:
        var urlStr = NSURL(string: "http://ww3.sinaimg.cn/mw690/51f76ed7jw1e3ohzmmnffj.jpg")!
        var request = NSURLRequest(url: urlStr as URL)
        var imgData = try! NSURLConnection.sendSynchronousRequest(request as URLRequest, returning: nil)
        var img: UIImage? = nil
        var imageView1 = UIImageView()
        if imgData != nil {
            img = UIImage(data: imgData)!
            imageView1.image = img
            print("width:" + "\(img?.size.width)" + "height:" + "\(img?.size.height)")
        }
方法2:
    let lhhImageView = UIImageView()
        lhhImageView.sd_setImage(with: URL(string: "http://ww3.sinaimg.cn/mw690/51f76ed7jw1e3ohzmmnffj.jpg")) { (image, error, cacheType, imageURL) in
            print("width:" + "\(image?.size.width)" + "height:" + "\(image?.size.height)")
        }
        self.view.addSubview(lhhImageView)

看代码:

  func getImageSize(imageURL:String) ->CGSize {
        var URL:NSURL?
        if imageURL.isKindOfClass(NSString) {
            URL = NSURL(string: imageURL)
        }
        if URL == nil
        {
            return  CGSizeZero             // url不正确
        }
        let request = NSMutableURLRequest(URL: URL!)
        let pathExtendsion = URL?.pathExtension?.lowercaseString
        var size = CGSizeZero
        if pathExtendsion == "png" {
            size = self.getPNGImageSize(request)
        }
        else if pathExtendsion == "gif"
        {
            size = self.getGIFImageSize(request)
        }
        else{
            size = self.getJPGImageSize(request)
        }
        if CGSizeEqualToSize(CGSizeZero, size)                   // 如果获取文件头信息失败,发送异步请求请求原图
        {
            guard let data = try? NSURLConnection.sendSynchronousRequest(request, returningResponse: nil) else{
                return size
            }
            let image = UIImage(data: data)
            if image != nil {
                size = (image?.size)!
            }
        }
        return size
    }
    func getPNGImageSize(request:NSMutableURLRequest) -> CGSize {
        //  获取PNG图片的大小
        request.setValue("bytes=16-23", forHTTPHeaderField: "Range")
        guard let data = try? NSURLConnection.sendSynchronousRequest(request, returningResponse: nil) else{
            return CGSizeZero
        }
        if data.length == 8 {
            var w1:Int = 0
            var w2:Int = 0
            var w3:Int = 0
            var w4:Int = 0
            data.getBytes(&w1, range: NSMakeRange(0, 1))
            data.getBytes(&w2, range: NSMakeRange(1, 1))
            data.getBytes(&w3, range: NSMakeRange(2, 1))
            data.getBytes(&w4, range: NSMakeRange(3, 1))
            let w = (w1 << 24) + (w2 << 16) + (w3 << 8) + w4
            var h1:Int = 0
            var h2:Int = 0
            var h3:Int = 0
            var h4:Int = 0
            data.getBytes(&h1, range: NSMakeRange(4, 1))
            data.getBytes(&h2, range: NSMakeRange(5, 1))
            data.getBytes(&h3, range: NSMakeRange(6, 1))
            data.getBytes(&h4, range: NSMakeRange(7, 1))
            let h = (h1 << 24) + (h2 << 16) + (h3 << 8) + h4
            return CGSizeMake(CGFloat(w), CGFloat(h));
        }
        return CGSizeZero;
    }
    func getGIFImageSize(request:NSMutableURLRequest) -> CGSize {
        //  获取GIF图片的大小
        request.setValue("bytes=6-9", forHTTPHeaderField: "Range")
        guard var data = try? NSURLConnection.sendSynchronousRequest(request, returningResponse: nil) else{
            return CGSizeZero
        }
        if data.length == 4 {
            var w1:Int = 0
            var w2:Int = 0
            data.getBytes(&w1, range: NSMakeRange(0, 1))
            data.getBytes(&w2, range: NSMakeRange(1, 1))
            var w = w1 + (w2 << 8)
            var h1:Int = 0
            var h2:Int = 0
            data.getBytes(&h1, range: NSMakeRange(2, 1))
            data.getBytes(&h2, range: NSMakeRange(3, 1))
            var h = h1 + (h2 << 8)
            return CGSizeMake(CGFloat(w), CGFloat(h));
        }
        return CGSizeZero;
    }
    func getJPGImageSize(request:NSMutableURLRequest) -> CGSize {
        //  获取JPG图片的大小
        request.setValue("bytes=0-209", forHTTPHeaderField: "Range")
        guard var data = try? NSURLConnection.sendSynchronousRequest(request, returningResponse: nil) else{
            return CGSizeZero
        }
        if data.length <= 0x58 {
            return CGSizeZero
        }
        if data.length < 210 {
            var w1:Int = 0
            var w2:Int = 0
            data.getBytes(&w1, range: NSMakeRange(0x60, 0x1))
            data.getBytes(&w2, range: NSMakeRange(0x61, 0x1))
            var w = (w1 << 8) + w2
            var h1:Int = 0
            var h2:Int = 0
            data.getBytes(&h1, range: NSMakeRange(0x5e, 0x1))
            data.getBytes(&h2, range: NSMakeRange(0x5f, 0x1))
            var h = (h1 << 8) + h2
            return CGSizeMake(CGFloat(w), CGFloat(h));
        }
        else
        {
            var word = 0x0
            data.getBytes(&word, range: NSMakeRange(0x15, 0x1))
            if word == 0xdb {
                data.getBytes(&word, range: NSMakeRange(0x5a, 0x1))
                if word == 0xdb {
                    var w1:Int = 0
                    var w2:Int = 0
                    data.getBytes(&w1, range: NSMakeRange(0xa5, 0x1))
                    data.getBytes(&w2, range: NSMakeRange(0xa6, 0x1))
                    var w = (w1 << 8) + w2
                    var h1:Int = 0
                    var h2:Int = 0
                    data.getBytes(&h1, range: NSMakeRange(0xa3, 0x1))
                    data.getBytes(&h2, range: NSMakeRange(0xa4, 0x1))
                    var h = (h1 << 8) + h2
                    return CGSizeMake(CGFloat(w), CGFloat(h));
                }
                else
                {
                    var w1:Int = 0
                    var w2:Int = 0
                    data.getBytes(&w1, range: NSMakeRange(0x60, 0x1))
                    data.getBytes(&w2, range: NSMakeRange(0x61, 0x1))
                    var w = (w1 << 8) + w2
                    var h1:Int = 0
                    var h2:Int = 0
                    data.getBytes(&h1, range: NSMakeRange(0x5e, 0x1))
                    data.getBytes(&h2, range: NSMakeRange(0x5f, 0x1))
                    var h = (h1 << 8) + h2
                    return CGSizeMake(CGFloat(w), CGFloat(h));
                }
            }
            else {
                return CGSizeZero;
            }
        }
    }


目录
相关文章
|
2月前
|
Java
Java开发实现图片URL地址检验,如何编码?
【10月更文挑战第14天】Java开发实现图片URL地址检验,如何编码?
92 4
|
7月前
【微信公众平台对接】有关【上传图文消息内的图片获取URL】调用示例
【微信公众平台对接】有关【上传图文消息内的图片获取URL】调用示例
172 0
|
3月前
|
数据采集 存储 前端开发
Java爬虫开发:Jsoup库在图片URL提取中的实战应用
Java爬虫开发:Jsoup库在图片URL提取中的实战应用
|
6月前
|
Java 机器人 API
JAVA实现自动打开URL对应的网页并保存为图片-不借助第三方API
JAVA实现自动打开URL对应的网页并保存为图片-不借助第三方API
51 9
|
5月前
|
Web App开发 前端开发
canvas保存图片时,谷歌浏览器Chrome报错【解决方案】Not allowed to navigate top frame to data URL
canvas保存图片时,谷歌浏览器Chrome报错【解决方案】Not allowed to navigate top frame to data URL
158 0
|
5月前
|
JavaScript
js 下载文件(根据URL下载文件,根据URL下载图片)
js 下载文件(根据URL下载文件,根据URL下载图片)
657 0
|
7月前
|
缓存 Java Apache
Spring一行代码搞定图片url地址转换为Base64,超简单!!!!
这段内容讲述了如何将URL指向的图片转换为Base64字符串。首先通过`org.apache.commons.io.IOUtils`或Java标准库读取URL的字节流,然后用Java 8的`Base64`类编码。示例代码提供了两种实现方式:一种依赖Apache Commons IO,另一种仅使用Java内置类。在第二种方式中,自定义了`toByteArray()`方法处理输入流并转换为字节数组,最后关闭输入流释放资源。
|
6月前
|
文字识别 API 开发工具
视觉智能开放平台产品使用合集之人像分割抠图返回的图片URL是否可以直接转存到自己的储存桶
视觉智能开放平台是指提供一系列基于视觉识别技术的API和服务的平台,这些服务通常包括图像识别、人脸识别、物体检测、文字识别、场景理解等。企业或开发者可以通过调用这些API,快速将视觉智能功能集成到自己的应用或服务中,而无需从零开始研发相关算法和技术。以下是一些常见的视觉智能开放平台产品及其应用场景的概览。
|
6月前
|
文字识别 算法 API
视觉智能开放平台产品使用合集之在调用接口传入的图片URL参数,文件在本地或者非上海地域OSS链接,该怎么办
视觉智能开放平台是指提供一系列基于视觉识别技术的API和服务的平台,这些服务通常包括图像识别、人脸识别、物体检测、文字识别、场景理解等。企业或开发者可以通过调用这些API,快速将视觉智能功能集成到自己的应用或服务中,而无需从零开始研发相关算法和技术。以下是一些常见的视觉智能开放平台产品及其应用场景的概览。
|
7月前
|
存储 网络协议 网络安全
对象存储oss使用问题之私有图片url在服务器中无法直接打开如何解决
《对象存储OSS操作报错合集》精选了用户在使用阿里云对象存储服务(OSS)过程中出现的各种常见及疑难报错情况,包括但不限于权限问题、上传下载异常、Bucket配置错误、网络连接问题、跨域资源共享(CORS)设定错误、数据一致性问题以及API调用失败等场景。为用户降低故障排查时间,确保OSS服务的稳定运行与高效利用。
1062 0