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-11-23 17:51:59 u013588966 阅读数 223

如果美工只做了高分辨率的图 例如 icon.png  1024*1024.png


我们需要生成一倍分辨和二倍分辨率的图  


cp 1024*1024.png 1024*1024@3x.png 

// 复制出一个1024*1024@3x.png 

sips -Z 114 114 1024*1024@3x.png --out 114*114@2x.png

生成@2x的图片 

sips -z 300 600 ~/Desktop/Test/*.JPG

不懂得话 sips --help 

2018-08-29 00:39:24 kivenhehaoyu 阅读数 258

 测试版本:20180829

Xcode:9.4.1

脚本地址:https://github.com/Kivenhaoyu/x264-iOS-build-script

脚本原地址:https://github.com/depthlove/x264-iOS-build-script

直接运行此脚本会自动下载 x264,并生成 iOS 编译包,修改下载连接部分

curl ftp://ftp.videolan.org/pub/x264/snapshots/last_x264.tar.bz2 | tar xj && ln -s x264-snapshot-20180827-2245 x264 || exit 1

问题1 通过源代码编译出的X264程序,版本号最后一项为什么是x

  这个情况是通过直接下载方式下载的源代码,由于没有git相关信息,所以编译出的程序通过-V 查看版本号时会显示诸如:0.152.x,而不是:0.152.2854 e9a5903(152是X264 Build 版本号)。所以为了同行之间方便交流或程序升级管理方面考虑,最好还是安装git,通过git下载源代码并编译出适合自己的x264程序。

问题2 iOS 编译出现 No working C compiler found.

  这种情况检查方向有两种:

  1. Xcode 版本是否正常,是否有两个 Xcode 同时存在,两个是否都设置了 command line tool,打开 preferences->locations->command line tools       
  2. command line tools 是否安装,打开终端输入
xcode-select --install 

若显示为

 xcode-select: error: command line tools are already installed, use "Software Update" to install updates

则表示正常,若无则可直接继续安装

postedit&t=1535473928030?mid=&wid=51824&sid=&tid=7009&rid=BEFORE_OPTOUT_REQ&t=1535473928031?mid=&wid=51824&sid=&tid=7009&rid=FINISHED&custom1=mp.csdn.net&t=1535473928031

82156919&t=1535474410259?mid=&wid=51824&sid=&tid=7009&rid=BEFORE_OPTOUT_REQ&t=1535474410260?mid=&wid=51824&sid=&tid=7009&rid=FINISHED&custom1=mp.csdn.net&t=1535474410260

2016-02-01 18:04:47 sily_13 阅读数 181

下文注意开闭区间就行

1.  获取 [1,5]之间的随机数

     int x = arc4random() % 5 + 1;

2. 获取 [0,100)之间的随机数

     int x = arc4random() % 100;

3. 获取 [50,100]之间的随机数

    int x = arc4random() % (100 - 50 + 1) + 50;

4. 获取 [num1,num2]之间的随机数

   - (NSInteger)getRandomNumber:(NSInteger)num1 to:(NSInteger)num2
  {
       NSInteger num = arc4random()%(num2 - num1 + 1) + num1;
       return num;
  }

2016-08-15 16:26:59 Cituses 阅读数 538
Objective-C语言中生成随机数的函数

arc4random()函数
arc4random()函数用来生成随机数且不需要种子,但是这个函数生成的随机数范围比较大,需要用取模的算法对随机值进行限制,有点麻烦

随机函数arc4random()使用方法
// 获取 0 ~ 99 随机数
int x = arc4random() % 100;
// 获取 500 ~ 1000 随机数 
int y =  (arc4random() % 501) + 500);

arc4random_uniform()函数
可以用来产生0~(x-1)范围内的随机数,不需要再进行取模运算。如果要生成1~x的随机数,可以这么写:arc4random_uniform(x)+1。

随机函数arc4random_uniform()使用方法
// 生成0-x之间的随机正整数
int value =arc4random_uniform(x + 1);

iOS生成二维码

阅读数 750

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