2016-04-14 13:21:28 gang544043963 阅读数 1322
  • FFmpeg音视频开发实战5 iOS/Android/windows/Linux

    本课程适合从事音视频,网络通讯开发的程序员。实战案例可用于 音视频处理,无人机,安防,直播等所有音视频领域。课程从Linux音视频采集,到TCP/IP UDP Socket服务器,客户端编程, 如何去定义网络通讯私有协议,x264,FFmpeg编解码,OpenGL ES渲染视频。OpenAL播放音频。到pcm实时转AAC,到H.264+AAC合成mp4, 整个流程,涵盖iOS,Android ,Mac 嵌入式Linux音视频相关绝大多数实用场景。以及Posix编程接口,C C++ Qt,FFmpeg跨平台开发,iOS,Android,Mac,linux,桌面软件都不再是障碍。让学员能够,融汇贯通掌握音视频领域相关知识,从事音视频相关职业,年薪轻松三四十万不是梦。 付费学员加入QQ群,可获得1~3年的专业解答,周六晚8:00 ~10:00 QQ群内部直播答疑, 以及就业指导,项目练习等服务.

    163938 人正在学习 去看看 陈超

原文出处:http://my.oschina.net/u/1044174/blog/364079

本文提供的方法可以只需要一套@3x的图片兼容所有iOS设备和系统(当然了,这里指大于4.0的系统,4.0的系统还有人用么),本方法采用替换UIImage的一个类方法和UIImageNibPlaceholder的一个实例方法来实现的(其实就是偷梁换柱啦)。特别声明:UIImageNibPlaceholder是苹果的私有类,如果要上传AppStore的话,又被拒的风险,请慎重考虑。只发企业版的可忽略本申明

自从iPhone6和iPhone6+出来了以后,iOS开发的程序猿从此走上了和android一样的道路,各种适配,头都大了。特别是万恶的iPhone6+,本来就被图片塞的很臃肿的app现在又要加一套@3x的图片,要知道这一套图片能把app撑大一倍呀。而且@3x图片完全可以压缩成@2x和@1 x的图片,于是我毅然踏上的用一套图片兼容所有设备的道路。历经千辛万苦,摸爬于各大外国论坛,终于让我找到了一个可行的方法。

一个分类搞定:

 UIImage+LocalImage.h


#import <UIKit/UIKit.h>
 
@interface UIImage (LocalImage)
 
/** 将原本3倍尺寸的图片缩放到设备对应尺寸 */
- (UIImage *)scaledImageFrom3x;
 
@end

  UIImage+LocalImage.m

#import "UIImage+LocalImage.h"
#import <objc/runtime.h>
 
// 当前iOS版本
#ifndef __CUR_IOS_VERSION
#define __CUR_IOS_VERSION ([[[UIDevice currentDevice] systemVersion] floatValue] * 10000)
#endif
 
@implementation UIImage (LocalImage)
 
 
+ (void)load
{
    if (__CUR_IOS_VERSION >= __IPHONE_8_0) {
        // 由于iOS8已经兼容,所以不需要使用下面方法
        return;
    }
     
    // 改替换实现用代码调用imageNamed:时的图片适应
    SEL origM = @selector(imageNamed:);
    SEL newM = @selector(imageWithName:);
    method_exchangeImplementations(class_getClassMethod(self, origM), class_getClassMethod(self, newM));
     
    // 该替换实现对xib中图片的适应
    NSString *className = [[@"UIImage" stringByAppendingString:@"Nib"] stringByAppendingString:@"Placeholder"]; // 这样写是为了避开AppStore审核的代码检查,不一定有效
    Method m1 = class_getInstanceMethod(NSClassFromString(className), @selector(initWithCoder:));
    Method m2 = class_getInstanceMethod(self, @selector(initWithCoderForNib:));
    method_exchangeImplementations(m1, m2);
     
}
 
 
/** 该方法替换原有的imageNamed:方法 */
+ (UIImage *)imageWithName:(NSString *)name
{
    UIImage *aImage = [self imageWithName:name];
    if (aImage) {
        // 如果能取到对应图片,则直接返回
        return aImage;
    }
     
    NSString *fileName = [name stringByAppendingString:@"@3x.png"];
    aImage = [UIImage imageWithContentsOfFile:[[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:fileName]];
     
    return [aImage scaledImageFrom3x];
}
 
/** 该方法替换UIImage-Nib-Placeholder中的initWithCoder:,因为xib的图片都是用这个类来初始化的 */
- (id)initWithCoderForNib:(NSCoder *)aDecoder
{
    NSString *resourceName = [aDecoder decodeObjectForKey:@"UIResourceName"];
    NSString *newResourceName = resourceName;
     
    if ([resourceName hasSuffix:@".png"]) {
        newResourceName = [resourceName substringToIndex:resourceName.length -4];
    }
     
    return [UIImage imageNamed:newResourceName];
}
 
 
/** 将原本3倍尺寸的图片缩放到设备对应尺寸 */
- (UIImage *)scaledImageFrom3x
{
    float locScale = [UIScreen mainScreen].scale;
     
    float theRate = 1.0 / 3.0;
    UIImage *newImage = nil;
     
    CGSize oldSize = self.size;
     
    CGFloat scaledWidth = oldSize.width * theRate;
    CGFloat scaledHeight = oldSize.height * theRate;
     
    CGRect scaledRect = CGRectZero;
    scaledRect.size.width  = scaledWidth;
    scaledRect.size.height = scaledHeight;
     
    UIGraphicsBeginImageContextWithOptions(scaledRect.size, NO, locScale);
     
    [self drawInRect:scaledRect];
     
    newImage = UIGraphicsGetImageFromCurrentImageContext();
     
    UIGraphicsEndImageContext();
     
    if(newImage == nil) {
        NSLog(@"could not scale image");
    }
     
    return newImage;
}

使用方法:只需要将这两个类导入到项目中即可,不需要在其他类中import。也不需要修改原来生成加载图片的方法,也不需要修改xib加载图片的方法,不过一定要确保有一套@3x的图片

该方法仅作用于iOS8一下的系统,因为经过验证,iOS8以上的系统都已经自动对图片进行适配了。


2015-10-30 11:11:41 u011347072 阅读数 665
  • FFmpeg音视频开发实战5 iOS/Android/windows/Linux

    本课程适合从事音视频,网络通讯开发的程序员。实战案例可用于 音视频处理,无人机,安防,直播等所有音视频领域。课程从Linux音视频采集,到TCP/IP UDP Socket服务器,客户端编程, 如何去定义网络通讯私有协议,x264,FFmpeg编解码,OpenGL ES渲染视频。OpenAL播放音频。到pcm实时转AAC,到H.264+AAC合成mp4, 整个流程,涵盖iOS,Android ,Mac 嵌入式Linux音视频相关绝大多数实用场景。以及Posix编程接口,C C++ Qt,FFmpeg跨平台开发,iOS,Android,Mac,linux,桌面软件都不再是障碍。让学员能够,融汇贯通掌握音视频领域相关知识,从事音视频相关职业,年薪轻松三四十万不是梦。 付费学员加入QQ群,可获得1~3年的专业解答,周六晚8:00 ~10:00 QQ群内部直播答疑, 以及就业指导,项目练习等服务.

    163938 人正在学习 去看看 陈超
       所表示的是每英寸所拥有的像素(Pixel)数目。因此PPI数值越高,即代表显示屏能够以越高的密度显示图像。当然,显示的密度越高,拟真度就越高。
          Pixels Per Inch是图像分辨率的单位,图像PPI值越高,画面的细节就会越丰富,因为单位面积的像素数量更多,所以数码相机拍出来的图片因品牌或生产时间不同可能有所不同,常见的有72PPI,180PPI和300PPI,默认出来就是这么多(A710拍出的是180PPI)。
        
如图,iPad2 是768 x 1024,iPad Retina 是1536 x 2048,开发时都按 768 * 1024 操作。但实际上两者有一倍差异。为了达到最佳效果,使用的图片大小不一样。这时候就用同一个名称,但 Retina 的图加上 @2x 后缀。系统加载图片时,在 iPad2 上会加载 @1x 的图在 1536 * 2048 的设备上,会加载 @2x 的。@3x 现在用于 iPhone 6/6+ 上

附带一提:iOS8渲染操作中使用前缀带有@1x、@2x 和@3x 的测试图像,代码会优先载入3x 图像。@2x图像不被加载。使用图像文件和XCAsset均不行。

用二倍图是为了适配iphone4以上的设备(所谓的retina屏),如果你的项目要适配3gs,那么你要备两套图,一套是一倍图,比如image.png(320*480),另一套是二倍图,比如image@2x.png(640*960)。当然你在用的时候,比如UIImage *image = [UIImage imageNamed:@"image.png"],或者UIImage *image = [UIImage imageNamed:@"image"],这两种方法,在iphone4以上系统会自动去找image@2x.png图片来显示。

1、在项目中,无论代码还是 xib只用不带@2x的图片做为名字,就像这样UIImage *image = [UIImage imageNamed:@"image.png"]

2、在真实文件中必须有@2x 的文件,不带@2x 的文件可有可无(如果有,可以在 xib 中更好的显示,因为xib 只认不带@2x 的图片预览)
2016-08-31 11:46:14 buildSetting 阅读数 8815
  • FFmpeg音视频开发实战5 iOS/Android/windows/Linux

    本课程适合从事音视频,网络通讯开发的程序员。实战案例可用于 音视频处理,无人机,安防,直播等所有音视频领域。课程从Linux音视频采集,到TCP/IP UDP Socket服务器,客户端编程, 如何去定义网络通讯私有协议,x264,FFmpeg编解码,OpenGL ES渲染视频。OpenAL播放音频。到pcm实时转AAC,到H.264+AAC合成mp4, 整个流程,涵盖iOS,Android ,Mac 嵌入式Linux音视频相关绝大多数实用场景。以及Posix编程接口,C C++ Qt,FFmpeg跨平台开发,iOS,Android,Mac,linux,桌面软件都不再是障碍。让学员能够,融汇贯通掌握音视频领域相关知识,从事音视频相关职业,年薪轻松三四十万不是梦。 付费学员加入QQ群,可获得1~3年的专业解答,周六晚8:00 ~10:00 QQ群内部直播答疑, 以及就业指导,项目练习等服务.

    163938 人正在学习 去看看 陈超

初代iPhone

2007年,初代iPhone发布,屏幕的宽高是 320 x 480 像素。下文也是按照宽度,高度的顺序排列。这个分辨率一直到iPhone 3GS也保持不变。


那时编写iOS的App(应用程序),只支持绝对定位。比如一个按钮(x, y, width, height) = (20, 30, 40, 50),就表示它的宽度是40像素,高度是50像素,放在(20, 20)像素的位置。


iPhone 4

2010年,iPhone 4发布,率先采用Retina显示屏,在屏幕的物理尺寸不变的情况下,像素成倍增加,达到 640 x 960 像素。


这样就出现一个问题,怎么让原有的App运行在新的手机上面?iPhone手机一个优势,就是有众多优秀的App,假如不兼容原有的App,就相当于放弃这个得来不易的优势,是很不明智的。


每当iPhone的屏幕有所变化,比如iPhone 3GS过渡到iPhone 4, iPhone 4过渡到iPhone 5, iPhone 5过渡到iPhone 6,苹果公司都需要想办法来解决上述的兼容问题。


为了运行之前的App,引入一个新的概念point(点)。点这个概念在iOS开发中十分重要,而非开发者很少关注。iPhone 4屏幕尺寸继续保持320 x 480,不过单位并非是像素,而是点。


在iPhone 3GS中,1个点等于1个像素。也就是说,点跟像素可以直接互换。

在iPhone 4中,1个点等于2个像素。


iPhone 4和iPhone 3GS的屏幕尺寸实际上是一样的,都是3.5英寸。同样一个点,实际上看起来是一样的。只是iPhone 4在单位英寸上像素更多,看起来更细腻。


开发iOS的时候,使用点作为基本单位会更加方便。列表对比


这里的屏幕模式可以初步理解成,一个点等于多少个像素。2x,就是1个点等于2个像素。


总结一下单位

手机屏幕的物理长度,使用英寸作为单位。比如iPhone 4屏幕是3.5英寸,iPhone 5 是4英寸,iphone 6是4.7英寸,这里的数字是指手机屏幕对角线的物理长度。


屏幕像素,比如iPhone 3GS屏幕是320 x 480像素,iPhone 4是640 x 960像素,这里的像素可以想象成屏幕上真正用来显示颜色的发光小点。


点,开发App时候使用的单位,是一个虚拟的单位,并非实际存在的,因此点有时也叫虚拟点。点这个单位,用于屏蔽各个屏幕设备的不同,兼容以前的程序。


每英寸有多少个像素,称为ppi(pixel per inch)。我们可以简单算算,iPhone 4是640 x 960像素,对角线就是1154像素,除以3.5英寸,应该是330ppi。而官方给出的数字是326ppi。当像素太密,超过300ppi的时候,人眼也就不能区分出每个像素。因此iPhone 4的屏幕叫作Retina显示屏。Retina在英文中,是视网膜的意思。


iPhone 4之后(x, y, width, height) = (20, 30, 40, 50),就表示高度为40个点,宽度为50个点,放在(20, 20)个点的位置。这种处理方法,将之前以像素作为单位自动转换成以点作为单位,使得iPhone 3GS的应用程序,不用修改也可运行在iPhone 4上面。


文字,颜色等是矢量数据,放大不会失真。原有的iPhone 3GS程序,在iPhone 4上面运行,文字显示也十分清晰。


而图片并非矢量数据,处理方式有所不同。假设图片 example.png,大小为 30 x 40像素(这里的单位是像素,数字图片的单位通常都为像素)。当这张example.png在iPhone 3GS和iPhone 4中使用时候,都占据屏幕上30 x 40个点。而因为iPhone 4中1个点等于2个像素,也就是30 x 40像素的图片,占据了60 x 80像素的屏幕,因此这图片在iPhone 4中看起来就会模糊。


开发的时候,为使得图片清晰,需要进行图片适配。这时需要准备两张内容相同的图片,放在同一目录下。

example.png      // 30 x 40像素
example@2x.png   // 60 x 80像素

当程序中使用example.png的时候,会根据屏幕模式自动选择对应的图片。屏幕1x模式,就会选择example.png, 2x模式就会优先选择example@2x.png,假如example@2x.png不存在,就选择example.png。


图片跟屏幕一样,也有1x模式,2x模式。在iPhone 6 Plus中,还出现3x模式,原理是一样的。


当iPhone 4选中example@2x.png的图片,就会生成一张大小为30 x 40个点,2x模式的图片。这个时候,图片看起来就会很清晰了。而没有适配的旧程序,example@2x.png不存在,就选中example.png,生成大小为30 x 40个点,1x模式的图片,看起来比较模糊。但它们占据的屏幕点数是一样的。


iPhone 5

2012年,苹果发布iPhone 5。我们将所有机型对比,依然采用点作为单位。


跟iPhone 4做比较, iPhone 5的宽度保持不变。高度增加568 - 480 = 88个点。

在iOS开发中,44这个数字比较特殊。iOS界面指南写着,人类的手指有一定大小,点击区域低于44个点的时候,就难以点中。44的两倍就是88。


当原有程序没有适配iPhone 5的时候,也可以正常运行,但多出来的88个点将会将会被自动均分为上下两部分,使得上下出现黑边。我找不到好看的图片。


那么怎样才能告诉iOS系统,应用程序已经适配了iPhone 5呢?在这里,我们先扯开一下,谈一下启动图片。


点击主屏幕的图标,进入App的时候,会立即显示一张图片,这张图片就是启动图片(Launch Image)。App在正式启动的时需要做一些初始化处理,这通常比较费时。先出现启动图片,可以使用户觉得系统立即有响应,减少等待的焦虑感。


每个机型,比如同时支持iPhone和iPad的程序,需要分别为iPhone跟iPad指定启动图片。当旧的iPhone 4的程序,运行在iPhone 5上面,没有iPhone 5的启动图片,就采用兼容模式,上下留黑边。当为iPhone 5指定了新的启动图片,系统就认为这个应用程序是已经适配了iPhone 5的,上下就不会留黑边了。下面是微信启动图片,应该都很熟悉了。


微信启动图片中出现的那个地球,叫蓝色弹珠(The Blue Marble),是在1972年12月7日由阿波罗17号太空船的船员所拍摄的。这张照片当年很震撼,是普通人第一次可以通过照片直接看到地球的全貌。见问题为什么微信启动界面的地球图片没有转到中国这部分?这是否有损用户体验?


微信的启动图,为适配iPhone 5,相比与iPhone 4, 很明显狭长了。


典型iPhone应用程序(游戏除外),很多是上面一个导航栏,下面一个工具栏或者标签栏, 中间一大块用于显示的内容区。iPhone 5拉长了,对于程序的适配,也不算麻烦,内容区的内容基本是动态生成的。适配时候可以简单上下不变,中间的内容区拉长就行了。注意,导航栏和工具栏的高度也是44个点。下面是同一程序,在iPhone 4跟iPhone 5的对比。



AutoLayout

到了这个时候,传统绝对定位的弱点就显露出来了。这时iPhone按照点作为单位,已经出现了两种不同尺寸的屏幕,算上iPad, 就有3种尺寸(有些App可以同时兼容iPhone和iPad,称为Universal)。


从iOS 6系统发布后,iOS开发中可以采用一种AutoLayout的技术。AutoLayout就像网页一样,指定View,Button,Text之间的相对位置,比如靠左多少,靠右多少,居中多少等等。举个例子,像下面的简单布局。



假设左上角的区域为view1, 右上角的区域为view2, 下面的区域为view3。AutoLayout会说:

view1.left = 20               // View1的左边距离边界20个点
view1.top = 20                // View1的上边距离边界20个点

view2.right = 20              // View2的右边距离边界20个点
view2.top = 20                // View2的上边距离边界20个点
view2.left = view1.left + 20  // View2的左边距离View1右边20个点
view2.width = view1.width     // View1的宽度等于View2的宽度
view2.height = view1.height   // view1高度等于view2高度

view3.left = view1.left       // view3的跟view1左对齐
view3.right = view2.right     // view3跟view2右对齐
view3.top = view1.bottom + 20 // view3的上边距离view1下边20个点
view3.bottom = 20             // view3下边距离边界20个点
view3.height = view1.height   // view3高度等于view1高度


指定上面的约束条件后,AutoLayout就会自动算出对应的布局。上面我写得比较繁琐,事实上很多操作都是可以使用鼠标拖拉来指定的,并不一定需要使用代码。但就算用代码,也有简写的方法。下面是在xib中,拖拉鼠标指定约束时的界面。


而绝对定位,会直接说

view1.frame = (x1, y1, width1, height1)
view2.frame = (x2, y2, width2, height2)
view3.frame = (x3, y3, width3, height3)


绝对定位并非指定约束条件,而是开发者自己来精确指定View,Button, Text等的实际坐标大小。

对于一个屏幕,绝对定位可能跟AutoLayout的区别不算大,甚至绝对定位会更方便些。但当需要同时适配多个屏幕,AutoLayout根本不需要更改。而绝对定位就需要根据屏幕大小,一个个算出来。比如横屏,在AutoLayout下面,就自动变成。


这里不过是3个控件的布局,当出现的控件数越多,屏幕尺寸越多,AutoLayout的优势就显露出来了。另外AutoLayout有个好处是容易支持多语言,不同语言下,同一个意思文字的长度是不同的,使用AutoLayout也可以自动适配。


在iOS 6的时候,AutoLayout还比较少人使用,当时屏幕尺寸还比较少。iOS 7的时候,就开始很多人使用了。而到现在iOS 8了, 更加上iPhone 6, iPhone 6 Plus需要适配,AutoLayout大势所趋,不用不行了。


iPhone 6, iPhone 6 Plus

2014年,iPhone 6, iPhone 6 Plus发布后,情况又有新的变化。再次比较所有iPhone机型。


屏幕尺寸再度分裂。但是我们比较iPhone 5 跟 iPhone 6的宽高比例。


可以看出,iPhone 6跟iPhone 5虽然屏幕尺寸改变了,但是它们的比例是不变的。都是 9 ÷ 16 = 0.5625 的屏幕。


当旧的iPhone 5程序运行在iPhone 6上面,假如没有经过适配。旧程序自动等比放大,铺满新手机,旧程序也可以正常运行。这种方案可算是自动适配。但因为旧程序拉伸了,整体看起来有点虚,也不能更好利用大屏空间。


当需要开发者手动适配的时候,跟iPhone 4过渡到iPhone 5一样,在新程序中,指定一张新的启动图片。当指定了启动图,屏幕分辨率就已经变成应有的大小,这时候利用AutoLayout进行布局,同一份代码,就可以支持多个机型。新手机的屏幕更大,有更多的虚拟点,可以显示更多的内容。


值得注意一点是,iPhone 6 Plus。它的宽高是414 × 736个点,3x模式,理想上来说,应该有1242 × 2208像素。但iPhone 6 Plus的实际像素是 1080 × 1920,是比理想值要少一点的。iPhone 6 Plus的处理方式是将程序整体稍微缩小一点。分辨率很高,这点区别,实际上也看不出来。这样处理,可以使得44个点的点击区域约束,在物理上的真实长度,基本保持不变。


由分析可以看到,慢慢的为了适配多个机型,程序的启动图片也逐渐增多,为解决这个问题。iOS之后,可以使用xib来搭建启动界面,这样就可以同一个启动界面,适配多个机型,减少启动图片占用的空间。


建议

1、以后的应用程序,都使用AutoLayout, 不要再用绝对定位。

2、使用类似网页的方式来设计界面。

3、设计师好,程序员也好,尽量使用点这个单位进行思考,而不要使用像素。比如,你需要做44 x 66个点的按钮,2x模式,就乘以2, 3x模式就乘以3。这样的思考方式可以大致估计到真实的物理长度。44个点,就是手机上导航栏,工具栏的高度。假如用像素思考,容易使得做出的图片过大或者过小。

4、非矢量素材,就可以做尺寸最大的,之后再进行缩小。比如你需要兼容3x的屏幕,就直接做最高那种图片。

5、而当使用Flash之类的矢量工具来做素材的时候,应该直接做点那个尺寸。比如44 x 66个点的按钮。就建立一个44 x 66的场景。之后再导出成2倍图,3倍图,因为矢量放大不失真。不要建立一个3x的场景,导出成大图片,再进行缩小,这样就容易失真。更理想的是直接使用矢量图。

6、假如是那种导航栏,工具栏之类的背景图,需要横跨整个屏幕。可以只切一小块,让程序拉伸,拉伸方式是保持两边的像素不动,只拉伸最中间的一列像素。需要拉伸的话,横方向就不要出现一些渐变色。

7、按钮的点击区域,不应该少于44像素,就算按钮的图片看起来比较小,也应该使得点按钮周围的透明区也有反应。

8、可以按照你当前最方便测试机子的型号来做一些主要预览图,效果图。比如你手头有iPhone 5,可以按照iPhone 5的尺寸,320 x 568个点,需要兼容iPhone 6 Plus,就使用3x的模式。这样方便将图片放进手机里面看实际的效果。有多个测试机,就选较大的,之后再进行一些细调。假如支持iPhone 6 Plus的横屏模式,需要另外处理。

9、上面说的是应用的处理方式,游戏会有些特殊。现在很多游戏,按照1136 x 768的像素尺寸来设计场景,这样可以同时兼容iPad和iPhone,并只使用一份图。iPad 1x模式下尺寸是1024 x 768像素,iPhone 6在2x模式下,是1136 * 640。这种尺寸,可以简单将场景居中显示,各自将场景拉伸到最大。



2016-04-14 23:07:33 sinat_34194127 阅读数 8390
  • FFmpeg音视频开发实战5 iOS/Android/windows/Linux

    本课程适合从事音视频,网络通讯开发的程序员。实战案例可用于 音视频处理,无人机,安防,直播等所有音视频领域。课程从Linux音视频采集,到TCP/IP UDP Socket服务器,客户端编程, 如何去定义网络通讯私有协议,x264,FFmpeg编解码,OpenGL ES渲染视频。OpenAL播放音频。到pcm实时转AAC,到H.264+AAC合成mp4, 整个流程,涵盖iOS,Android ,Mac 嵌入式Linux音视频相关绝大多数实用场景。以及Posix编程接口,C C++ Qt,FFmpeg跨平台开发,iOS,Android,Mac,linux,桌面软件都不再是障碍。让学员能够,融汇贯通掌握音视频领域相关知识,从事音视频相关职业,年薪轻松三四十万不是梦。 付费学员加入QQ群,可获得1~3年的专业解答,周六晚8:00 ~10:00 QQ群内部直播答疑, 以及就业指导,项目练习等服务.

    163938 人正在学习 去看看 陈超

1x 、2x 、3x图片介绍

手机屏幕分两种

  1. 视网膜屏:
    • 又叫Retain屏幕,就是高清视网膜屏幕,分辨率宽高是标准屏幕分辨率的2倍
  2. 非视网膜屏
    • 又叫非Retain屏,是标准分辨率

分辨率

  • 概念:分辨率的意思就是把屏幕进行横向、纵向等分,通常描述手机屏幕用来表示,在retina屏幕下,一个点表示两个像素,在非retina屏幕下,一个点表示一个像素,而像素,就是常说的分辨率,在iPhone6 Plus下,一个点表示3个像素

iPhone手机的分辨率


  • 在上图可以看出
    1. iPhone3GS的手机,是非视网膜屏幕,它的点 和 分辨率 是相同的,也就是两者相除 得 1
    2. 在iphone4/4S/5/5C//5S/6,它们都是视网膜屏幕,分辨率正好是点的两倍,相除得2
    3. 而在iPhone6 Plus,虽然也是视网膜屏幕,但是分辨率是点的三倍,也就是相除得3

1x 2x 3x 图片

  • 由于不同手机的屏幕的分辨率和它的点的倍数,是不同的,所以我们在实际开发中需要准备多套图片
  • 由于目前只存在1倍,2倍,3倍,这几种,所以目前准备的图片就分 1x,2x,3x图,当然由于只有3GS手机才是1x图,而3GS手机,基本上已经无人使用,可能很多公司已经不再去制作1x图片

图片的命名规则:

  • 1x图片: 直接使用文件名 btn_left.png
  • 2x图片: 在文件名后加上@2x标识 btn_left@2x.png
  • 3x图片: 在文件后加上@3x标识 btn_left@3x.png

总结

  1. 在同样一个尺寸的屏幕下由于使用的屏幕不一样(retina和非retina),所以造成的屏幕分辨率会不同.也就是说,同样是30*30的像素,在3.5 inch大小的屏幕上,如果是非retina显示会大一些,retina屏幕显示会小一些。
  2. 在开发中使用的是点.(比如 30 * 30 ,不是表示30像素,而是表示30点,这样的话iOS系统会自动把点转换为对应的像素)
    • 非retina屏幕1个点表示1像素
    • retian屏幕1个点表示2像素
    • iPhone6 Plus 下1个点表示3像素
  3. 因为程序中的是,iOS系统会自动把点转换为不同的像素去找图片,所以图片对应的也要准备多份不同的图片,
    • @2X:视网膜屏幕,在原来点坐标的大小上乘以2
    • @3X:在原来的坐标的大小上乘以3
2014-11-03 11:20:57 u012371868 阅读数 1296
  • FFmpeg音视频开发实战5 iOS/Android/windows/Linux

    本课程适合从事音视频,网络通讯开发的程序员。实战案例可用于 音视频处理,无人机,安防,直播等所有音视频领域。课程从Linux音视频采集,到TCP/IP UDP Socket服务器,客户端编程, 如何去定义网络通讯私有协议,x264,FFmpeg编解码,OpenGL ES渲染视频。OpenAL播放音频。到pcm实时转AAC,到H.264+AAC合成mp4, 整个流程,涵盖iOS,Android ,Mac 嵌入式Linux音视频相关绝大多数实用场景。以及Posix编程接口,C C++ Qt,FFmpeg跨平台开发,iOS,Android,Mac,linux,桌面软件都不再是障碍。让学员能够,融汇贯通掌握音视频领域相关知识,从事音视频相关职业,年薪轻松三四十万不是梦。 付费学员加入QQ群,可获得1~3年的专业解答,周六晚8:00 ~10:00 QQ群内部直播答疑, 以及就业指导,项目练习等服务.

    163938 人正在学习 去看看 陈超

如果对icon的后缀@2x或@3x理解不够,在iOS7和iOS8下图片会出现显示异常(尺寸减半)

三张图片 red.png(50x30)      red@2x.png(100x60)        red@3x.png(150x90)

测试代码:


UIImage *image1 = [UIImage imageNamed:@"red"];

NSLog(@“%f,%f",image1.size.width,image1.size.height);

UIImageView *imageView1 = [[UIImageView alloc]initWithFrame:CGRectMake(0, 0, image1.size.width, image1.size.height)];

[imageView1 setImage:image1];

[self.view addSubview:imageView1];

    

UIImage *image2 = [UIImage imageNamed:@"red@2x"];

NSLog(@"%f,%f",image2.size.width,image2.size.height);

UIImageView *imageView2 = [[UIImageView alloc]initWithFrame:CGRectMake(0, 100, image2.size.width, image2.size.height)];

[imageView2 setImage:image2];

[self.view addSubview:imageView2];


UIImage *image3 = [UIImage imageNamed:@"red@3x"];

NSLog(@"%f,%f",image3.size.width,image3.size.height);

UIImageView *imageView3 = [[UIImageView alloc]initWithFrame:CGRectMake(0, 200, image3.size.width, image3.size.height)];

[imageView3 setImage:image3];

[self.view addSubview:imageView3];


在iOS7下面显示的效果:



在iOS8下显示的效果:


好了,那么问题来了:为什么会造成在iOS7和iOS8下出现这种图片显示的差异呢?

答案来了:

我们取本地图片有两种方法

1、UIImage *image = [UIImage imageNamed:imageName];

2、NSString *path = [[NSBundle mainBundle]pathForResource:imageName];

   UIImage *image = [[UIImage alloc] initWithContentsOfFile:path];

先说说第一种方法。根据上面运行的差异,我们可以得到这样的结论,iOS8对后缀@2x或者@3x是敏感的,系统会根据设备而去使用染@2x还是@3x进行渲染。

而size都是取一倍的图片大小(视网膜效果)。而iOS7对文件后缀@2x或@3x是不敏感的,他直接取red@2x或@3x这个文件的size,使用red@2x或@3x的图片。

而iOS8会取red文件这个size,不过使用的图片是red@2x或@3x,因为要保证像素的效果。其实图片名后缀@2x或@3x是系统根据不同的设备去使用相应的图片(plus使用的是@3x)。

所以我们使用第一种方法(imageNamed:)去渲染图片是不应该加后缀@2x或@3x的,后缀是系统自己判断的使用的,我们写图片名只要写如red.png这样就行了,然后系统会根据不同设备

使用相应的图片。这样不管是对后缀敏感的iOS8还是不敏感的iOS7都能正确的得到相应的图片。再说说第二种方法,这种方法渲染图片是直接取图片文件的路径,如果方法后面写的图片文件

名是red.png的话就直接使用这张图片(指哪就用哪),如果没用red.png这个文件image就位nil了,而使用第一种方法image就不会。第二种方法一般用来渲染比较大的本地图片,一般尺寸

是固定的。




iOS 图片批量添加@2x

阅读数 1337

iOS 设置启动图片

阅读数 1508

没有更多推荐了,返回首页