【问题标题】:How to Define UIImageView size as UIImage resolution?如何将 UIImageView 大小定义为 UIImage 分辨率?
【发布时间】:2012-05-13 22:31:30
【问题描述】:

我有一个场景,我正在使用 Web 服务获取图像,并且所有图像的分辨率都不同。现在我的要求是我想要每个图像的分辨率并使用它来定义 UIImageView 的大小,这样我就可以防止我的图像变得模糊

例如,如果图像分辨率为 326 像素/英寸,则图像视图应该是该图像的大小可以完全表示而没有任何模糊。

【问题讨论】:

    标签: iphone ipad uiimageview uiimage


    【解决方案1】:
    UIImage *img = [UIImage imageNamed:@"foo.png"];
    CGRect rect = CGRectMake(0, 0, img.size.width, img.size.height);
    UIImageView *imgView = [[UIImageView alloc] initWithFrame:rect];
    [imgView setImage:img];
    

    【讨论】:

      【解决方案2】:

      图像大小是它的分辨率。

      您的问题可能是 - 视网膜显示!

      检查 Retina 显示,因此 - 将 UIImageView 宽度/高度缩小两倍(这样每个 UIImageView 像素将由四个较小的 UIImage 像素组成,用于视网膜显示)。

      如何检查视网膜显示:

      https://stackoverflow.com/a/7607087/894671

      如何检查图像大小(实际上不将图像加载到内存中):

      NSString *mFullPath = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject] 
                      stringByAppendingPathComponent:@"imageName.png"];
      
      NSURL *imageFileURL = [NSURL fileURLWithPath:mFullPath];
      
      
      CGImageSourceRef imageSource = CGImageSourceCreateWithURL((CFURLRef)imageFileURL, NULL); 
      
      if (imageSource == NULL) 
      { 
          // Error loading image ... 
      } 
      
      NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys: [NSNumber numberWithBool:NO], (NSString *)kCGImageSourceShouldCache, nil]; 
      
      CFDictionaryRef imageProperties = CGImageSourceCopyPropertiesAtIndex(imageSource, 0, (CFDictionaryRef)options); 
      
      
      NSNumber *mImgWidth;
      
      NSNumber *mImgHeight;
      
      if (imageProperties) 
      {   
          //loaded image width
          mImgWidth = (NSNumber *)CFDictionaryGetValue(imageProperties, kCGImagePropertyPixelWidth); 
      
          //loaded image height      
          mImgHeight = (NSNumber *)CFDictionaryGetValue(imageProperties, kCGImagePropertyPixelHeight); 
      
          CFRelease(imageProperties); 
      }
      
      if (imageSource != NULL) 
      {
          CFRelease(imageSource);
      }
      

      所以——例如:

      UIImageView *mImgView = [[UIImageView alloc] init];
      
      [mImgView setImage:[UIImage imageNamed:@"imageName.png"]];
      
      [[self view] addSubview:mImgView];
      
      
      if ([UIScreen instancesRespondToSelector:@selector(scale)]) 
      {
          CGFloat scale = [[UIScreen mainScreen] scale];
      
          if (scale > 1.0) 
          {
              //iphone retina screen
              [mImgView setFrame:CGRectMake(0,0,[mImgWidth intValue]/2,[mImgHeight intValue]/2)];
          }
          else
          {
              //iphone screen
              [mImgView setFrame:CGRectMake(0,0,[mImgWidth intValue],[mImgHeight intValue])];
          }
      }
      

      希望对您有所帮助!

      【讨论】:

        【解决方案3】:

        您可以使用以下代码获取图像大小。所以,首先计算下载的图像大小,然后根据它制作图像视图。

        UIImage *Yourimage = [UIImage imageNamed:@"image.png"];
        CGFloat width = Yourimage.size.width;
        CGFloat height = Yourimage.size.height;
        

        希望对你有所帮助..

        【讨论】:

        • 这很好,但我不想要尺寸我想要分辨率并想设置尺寸,因为我有分辨率!
        • 如果您将图像加载到 UIImage 中,那么它的 size 属性会为您提供分辨率。
        • 我的图像在 UIImageView 中变得模糊
        【解决方案4】:
         UIImage *oldimage = [UIImage imageWithContentsOfFile:imagePath];  // or you can set from url with NSURL  
        
        CGSize imgSize = [oldimage size];
        
          imgview.frame = CGRectMake(10, 10, imgSize.width,imgSize.height);
        [imgview setImage:oldimage];  
        

        100% 工作......

        【讨论】:

          【解决方案5】:

          要解决这个问题,我们需要照顾device's display resolution.

          比如你有一张resolution的图片326ppi,和iPhone4、iPhone4S和iPod 4th Gen一样。所以你可以简单地使用@建议的解决方案尼特和@Peko。但对于其他设备(或这些设备上具有不同分辨率的图像),您需要将数学应用于calculate size 以获得更好的显示效果。

          现在假设您有 260ppi(尺寸为 W x H)的图像,并且您希望在 iPhone4S 上显示它,因此每英寸包含的信息较少比 iPhone 的显示分辨率更高,所以我们需要通过将图像尺寸减小 326/260 因子来调整它的大小。所以现在你将使用的 imageView 的大小是

          imageViewWidth = W*(260/326);
          
          imageViewHeight = H*(260/326);
          

          一般:

          resizeFactor = imageResolution/deviceDisplayResolution;
          imageViewWidth = W*resizeFactor;
          imageViewHeight = H*resizeFactor;
          

          这里我正在考虑当我们在 imageView 中设置图像并调整它的大小时,它不会从图像中删除或添加像素,

          【讨论】:

            【解决方案6】:

            让 UIImageView 使用 contentMode 属性为您调整图像大小。

            您可能希望以静态大小(“frame”属性)显示您的 UIImageView,该大小表示您要显示的图像的最大尺寸,并允许图像在该框架内相对于它们自己的特定尺寸调整大小要求(整体尺寸、纵横比等)。通过掌握 contentMode 属性,您可以让 UIImageView 为您处理不同大小的图像。它有许多不同的设置,其中之一是 UIViewContentModeScaleAspectFit,它会根据需要缩小图像以适应 UIImageView,如果图像更小,它将简单地居中显示。您可以使用设置来获得您想要的结果。

            请注意,使用这种方法,您无需执行任何特殊操作来处理与 Retina 显示器相关的缩放问题。

            【讨论】:

              【解决方案7】:

              根据您在问题正文中所述的要求,我相信您无需更改 UIImageView 大小。

              使用这行代码,图像可以完全表示,没有任何模糊:

              imageView.contentMode = UIViewContentModeScaleAspectFit;
              

              【讨论】:

                猜你喜欢
                • 2013-05-20
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多