2019-11-13 21:42:20 chuanyue11 阅读数 71

IOS图片生成工具(@1X,@2X,@3X)

在进行IOS开发过程中,经常需要为了适配不同分辨率的设备而准备不同尺寸的图片。由于本人长期从事后台研发工作,对前端及UI常用工具(比如PS)并不熟悉,于是开发了下面这个工具对一个大尺寸的图片进行裁剪,生成1倍、2倍、3倍尺寸的图片,方便进行IOS开发。

工具介绍

该工具接受两个参数,分别为源图片文件或目录和目标图片存放文件夹。源图片为分辨率高于所有裁剪结果图片的分辨率(@1X,@2X,@3X)。

裁剪结果图片的尺寸写在ResizeImage类开头处,可以根据需要进行修改。

工具代码

package tools;

import common.Base;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.util.Arrays;

/**
 * Genarate @1X, @2X, @3X pictures.
 *
 * @author zjm
 */
public class ResizeImage extends Base {
    private static final Logger LOGGER = LoggerFactory.getLogger(ResizeImage.class);

    /**
     * {width, height}
     */
    //    private static final int[] SIZE_3X = new int[] { 300, 402 };
    //    private static final int[] SIZE_2X = new int[] { 200, 268 };
    //    private static final int[] SIZE_1X = new int[] { 100, 134 };
    private static final int[] SIZE_3X = new int[] { 300, 300 };
    private static final int[] SIZE_2X = new int[] { 200, 200 };
    private static final int[] SIZE_1X = new int[] { 100, 100 };

    private String srcFileOrDirctory;
    private String destDirectory;

    public ResizeImage() {

    }

    public ResizeImage(String srcFileOrDirctory, String destFileOrDirectory) {
        this.srcFileOrDirctory = srcFileOrDirctory;
        this.destDirectory = destFileOrDirectory;
    }

    public String getSrcFileOrDirctory() {
        return srcFileOrDirctory;
    }

    public void setSrcFileOrDirctory(String srcFileOrDirctory) {
        this.srcFileOrDirctory = srcFileOrDirctory;
    }

    public String getDestDirectory() {
        return destDirectory;
    }

    public void setDestDirectory(String destDirectory) {
        this.destDirectory = destDirectory;
    }

    public void resizeImage() throws Exception {
        LOGGER.debug("Resize image parameters: src - {}, dest - {}", srcFileOrDirctory, destDirectory);

        File src = new File(srcFileOrDirctory);

        File dest = new File(destDirectory);
        if (dest.exists() && dest.isFile()) {
            throw new IllegalArgumentException("Not a directory: " + dest);
        }
        dest.mkdirs();

        if (src.exists() && src.isDirectory()) {
            File[] images = src.listFiles();
            for (File image : images) {
                resizeImage(srcFileOrDirctory, destDirectory);
            }
        } else if (src.exists() && src.isFile()) {
            resizeImage(srcFileOrDirctory, destDirectory);
        } else {
            throw new IllegalArgumentException("No such file or directory: " + src);
        }
    }

    private void resizeImage(String src, String dest) throws Exception {
        File destImage;

        destImage = new File(dest, getTypePrefix(src) + "@3X." + getTypeAppendix(src));
        resizeImage(src, destImage.getAbsolutePath(), SIZE_3X);

        destImage = new File(dest, getTypePrefix(src) + "@2X." + getTypeAppendix(src));
        resizeImage(src, destImage.getAbsolutePath(), SIZE_2X);

        destImage = new File(dest, getTypePrefix(src) + "@1X." + getTypeAppendix(src));
        resizeImage(src, destImage.getAbsolutePath(), SIZE_1X);
    }

    private void resizeImage(String src, String dest, int[] size) throws Exception {
        LOGGER.debug("Resizing image {} to {} in size {} ...", src, dest, Arrays.toString(size));

        BufferedImage srcImage = ImageIO.read(new File(src));

        BufferedImage destImage = new BufferedImage(size[0], size[1], srcImage.getType());
        Graphics2D destGraph = destImage.createGraphics();
        destGraph.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);
        destGraph.drawImage(srcImage, 0, 0, size[0], size[1], 0, 0, srcImage.getWidth(), srcImage.getHeight(), null);
        destGraph.dispose();

        ImageIO.write(destImage, getTypeAppendix(src), new File(dest));

        LOGGER.debug("A new image {} is created.", dest);
    }

    private String getTypeAppendix(String image) {
        int lastIndex = image.lastIndexOf(".");
        return image.substring(lastIndex + 1);
    }

    private String getTypePrefix(String image) {
        int lastSlashIndex = image.lastIndexOf("/");
        int lastDotIndex = image.lastIndexOf(".");
        return image.substring(lastSlashIndex + 1, lastDotIndex);
    }

    public static void main(String[] args) throws Exception {
        if (args.length != 2) {
            LOGGER.error("Invalid arguments. Usage: {} <source image file or directory> <dest image directory>",
                    ResizeImage.class.getSimpleName());
            System.exit(1);
        }
        new ResizeImage(args[0], args[1]).resizeImage();
    }
}

2015-02-05 13:48:06 u014493178 阅读数 761

在cocos2dx版本中使用视频播放器的话 需要以下步骤

1、在写一个.mm的文件 我这里的mm叫IOSPlayVedio这个

头文件定义这个

static void playOnLineVideo4IOS(char *pszVideoUrl);

.mm里面写

void IOSPlayVedio::playOnLineVideo4IOS(char *pszVideoUrl)

{

    NSString * strVideo = [NSString stringWithUTF8String:pszVideoUrl];

    AppController *app = (AppController*) [[UIApplication sharedApplication] delegate];

    [app playMovie:strVideo];


    

}


2、AppController 写一个方法  


-(void)playVedio:(NSString *)videofile;

-(void)playMovie:(NSString *)str{

    NSURL *url = [NSURL URLWithString:str];

    MoviePlayerViewController *movieVC = [[MoviePlayerViewController alloc]initNetworkMoviePlayerViewControllerWithURL:url movieTitle:@"达达网络"];

    movieVC.datasource = self;

    [viewController presentViewController:movieVC animated:NO completion:nil];

    

}


iOS代码在下面 ios程序员开源直接看源代码 

在cocos2dx中调用的

pCoursewareInformation->themeResources_video_url//里面是视频的地址  


代码下载地址

http://www.sundaboke.com/video.rar

2019-01-18 00:07:27 liuchuo 阅读数 1547

iOS开发中,会要求导入@1x、@2x和@3x:

使用@1x格式iPhone3GS

使用@2x格式iPhone 4,4S,5,5S,5C,SE,6,6S,7,8,XR

使用@3x格式iPhone 6Plus、6sPlus、7Plus、8Plus、X、XS、XS Max

这样在开发过程中,将三种图片(比如分别为1.png、1@2x.png和1@3x.png)导入到工程图库中的时候可以自动被识别为1x、2x和3x大小的图片

可以利用Mac系统中自带的服务自己制作一个快速生成@1x、@2x和@3x图片的功能

首先spotlight搜索Automator,然后按Enter打开

Snip20160127_93

新建文稿 

Snip20160127_94

选取文稿类型为 快速操作

Snip20160127_95

在工作流程收到当前的后面选择图像文件

Snip20160127_108

在左边窗口的“操作”下,选择“资源库”中的“文件和文件夹”,将右侧中的“给访达项目重新命名”拖入最右侧的大窗口中,(如果警告提示是否要增加一个“拷贝访达项目”操作,选择“不添加”),选择“添加文本”,在输入框中输入【@3x

拖入“复制访达项目

选择左侧“资源库”中的照片,将“缩放图像”拖入右侧窗口(如果警告提示是否要增加一个“拷贝访达项目”操作,选择“不添加”),并选择“按百分比”,输入【66

再拖入“文件和文件夹”下的“给访达项目重新命名”,并选择【替换文本】,查找【】,以【仅基本名称】;再拖入“文件和文件夹”下的“给访达项目重新命名”,并选择【替换文本】,查找【@3x”的副本】,以【仅基本名称】,替换成【@2x

拖入“复制访达项目”,选择左侧“资源库”中的照片,将“缩放图像”拖入右侧窗口(如果警告提示是否要增加一个“拷贝访达项目”操作,选择“不添加”),并选择“按百分比”,输入【50

再拖入“文件和文件夹”下的“给访达项目重新命名”,并选择【替换文本】,查找【】,以【仅基本名称】,再拖入“文件和文件夹”下的“给访达项目重新命名”,并选择【替换文本】,查找【@2x”的副本】,以【仅基本名称

然后保存,将“快速操作”存储为“制作@2x@3x图片

 

每次使用的时候,只需选中图片,选择访达 -> 服务 -> 制作@2x@3x图片就会自动生成三个图片:1.png、1@2x.png和1@3x.png

最终效果~

 

2015-07-27 15:32:03 M_nao 阅读数 26134

    1x,2x就是用于非Retain屏幕和Retain屏幕,3x现在用于iPhone6 Plus,在iPhone实际开发中,只有iPhone4 是非Retain屏幕,市场占有率很低,因此在切图时,只切@2x和@3x图片即可。以iphone 6做UI为例,如果图片大小为200*200px,例如图片命名为test_a@2x.png,那么还应切一张命名为test_a@3x.png的300*300px的图片来适配iPhone 6Plus。这样程序在运行时就能根据不同设备自动调用不同图片,从而达到最佳效果。

附一张原理图:


2015-01-29 22:03:05 forza2121 阅读数 4112

修改缘由

由于 iPhone 5S的A7 CPU   iPhone 6(A8 CPU)都已经支持64-bit ARM 架构,据说64位处理器跑64代码会提高处理能力?因此二月一新提交appstore应用必须支持64位并且六月份更新应用也必须支持。

支持64bit 关于Xcode “Build Setting” 设置

1. Xcode “Build Setting”中的Architectures参数必须设置Standard architectures (armv7,arm64).

2. Xcode “Build Setting”中的Valid Architectures 包含armv6 armv7 arm64

貌似两个指令集交集才是最终支持的版本

cocos2d-x 修改点:

cocos2d-x v2.2.6 已经支持64-bit,可以对照修改

1. libcurl.a libwebp.a 和相应的头文件 替换成支持64bit 库 2.2.6版本查找

	cocos2d/kazmath/src/neon_matrix_impl.c
	cocos2d/kazmath/src/mat4.c
	#if defined(__ARM_NEON__) 替换成 #if defined(_ARM_ARCH_7)

2.luajit 不支持64位如下:

Because luajit doesn't support 64-bit, so we use lua on iOS 64-bit. Considering performance issue, all other platforms include iOS 32-bit, we uses luajit. It means that you can not use lua bytecode on iOS if you build a single binary with both 32-bit and 64-bit code, because lua bytecode generated by lua and luajit are not compatible.

因此设置成64位 使用lua 32位代码依旧使用luajit设置如下:

Xcode “Build Setting”中的LIbrary Search Paths:

添加:"$(SRCROOT)/../../../scripting/lua/lua/ios" (检查符合自己工程路径)

Other Linker Flags: 增加如下参数 -z -lua (不懂,求大神答疑。貌似为了能连接到~)

3.检查第三方库,如 友盟 talkingdata 等一般都发布了最新版本

4.cocos2dx.xcodeporjArchitectures参数不要忘记修改成支持64位

   5.根据上述改变,官方文档 64-Bit Transition Guide for Cocoa Touch检查代码

主要问题是指针。 32位处理器4位,和int一样可以互转。64位处理器指针是8位不能直接转成int   要用intptr_t(不同处理器下定义与指针同位数)

例如:

CCCallFuncND::create( this , callfuncND_selector(Test::TestFunc1),(void *)10) , NULL );


回调中想传递参数10  32位时对于回调参数void* data  直接(int)data 即可,但64位会变异不过,要修改为(int)(intptr_t)data

注意不要与如下用法用混:

int a = 10

CCCallFuncND::create(this , callfuncND_selector( Test::TestFunc2),&a);

传递指针int num = *(int*)data







iOS图片@2X, @3x

阅读数 674

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