关于java图片切割的小demo

写此demo 的起因

         意图仿写一个flappybird,想获取flappybird的图片资源,反编译apk之后发现它的图片都被整合成了一张大图,如下

                                       

          atlas.png

       另发现一与之对应的atlas.txt文件,如图

                                     

                                              

        经研究发现,第一列为小图片文件名,第二三列为图片宽高,第四五列为图片在原图的x,y坐标的比例值,第六七列为图片宽高占原图的比例值

可以根据此文件确定小图片的基本属性,也知道小图片在大图的位置,遂开工。

       最终结果展示

                               

 

代码

            ImageBean类

public class ImageBean {
	private String name;
	private int x;
	private int y;
	private int w;
	private int h;
	
	public ImageBean(String name, int x, int y, int w, int h) {
		this.name = name;
		this.x = x;
		this.y = y;
		this.w = w;
		this.h = h;
	}
	
	public String getName() {
		return name;
	}

	public int getX() {
		return x;
	}

	public int getY() {
		return y;
	}

	public int getW() {
		return w;
	}

	public int getH() {
		return h;
	}

	@Override
	public String toString() {
		return name+" "+x+" "+y+" "+w+" "+h;
	}
}

            文本文件解析类

<pre name="code" class="java">import java.io.File;
import java.io.FileInputStream;
import java.util.ArrayList;
import java.util.Scanner;

public class TxtUtil {
	/**
	 * @param txtPath String 文本文件路径
	 * @return list ArrayList<String []> 以字符串数组为单位的动态顺序链表
	 * */
	public static ArrayList<String[]> getArrayList(String txtPath){
		ArrayList<String []> list = null;
		File file = null;
		FileInputStream inputStream = null;
		Scanner scanner = null;
		try {
			list = new ArrayList<>();
			
			file = new File(txtPath);
			inputStream = new FileInputStream(file);
			scanner = new Scanner(inputStream);
			
			while (scanner.hasNextLine()) {
				String lineString = scanner.nextLine();
				String[] result = lineString.split(" ");
				list.add(result);
			}
			
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				inputStream.close();
				scanner.close();
			} catch (Exception e) {
			}
		}
		return list;
	}
}

 

     获取image集合类

import java.util.ArrayList;

public class ImageUtil {
	
	public static ArrayList<ImageBean> getImageBeans(int imageSize,String txtPath){
		ArrayList<ImageBean> imageBeans = new ArrayList<>();
		ArrayList<String []> list = TxtUtil.getArrayList(txtPath);
		
		for (String[] strings : list) {
			String name = strings[0];
			int x = (int) (imageSize*Float.parseFloat(strings[3]));
			int y = (int) (imageSize*Float.parseFloat(strings[4]));
			int w = (int) (imageSize*Float.parseFloat(strings[5]));
			int h = (int) (imageSize*Float.parseFloat(strings[6]));
			
			imageBeans.add(new ImageBean(name,x,y,w,h));
		}
		return imageBeans;
	}
	
}

imagecut类 

       

import java.awt.Rectangle;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.ArrayList;

import javax.imageio.ImageIO;
import javax.imageio.ImageReadParam;
import javax.imageio.ImageReader;
import javax.imageio.stream.ImageInputStream;

/**
 * @author Guxingke
 * 
 * 图片切割的小demo
 * 
 * */
public class ImageCut {
	public static void main(String[] args) throws IOException {
		//定义文本文件、初始图片路径
		String txtPath = "res/res1/atlas.txt";
		String srcpath = "res/res1/atlas.png";
		//原文件尺寸,一般都是正方形
		int imageSize = 1024;
		//剪切后图片的保存路径
		String subpath = "result/cut1/";
		
		ArrayList<ImageBean> imageBeans = ImageUtil.getImageBeans(imageSize,txtPath);
		
		for (ImageBean imageBean : imageBeans) {
			cut(srcpath, subpath, imageBean);
		}
		
		System.out.println("success");
	}
	
	/**
	 * @param srcpath String 原文件路径
	 * @param subpath String 切割后的存盘路径
	 * @param imageBean ImageBean 
	 * 
	 * 根据原文件路径,切割后的存盘路径,imageBean ,切割图片 并保存
	 * */
	public static void cut(String srcpath, String subpath,ImageBean imageBean) throws IOException {
        FileInputStream is = null;
        ImageInputStream iis = null;
        try {
        	//ImageReader 初始化
        	ImageReader reader = (ImageReader) ImageIO
        			.getImageReadersByFormatName("png").next();
            is = new FileInputStream(srcpath);
            iis = ImageIO.createImageInputStream(is);
            reader.setInput(iis, true);
            
            //获取需要剪切的图片部分的 BufferImage 对象
            ImageReadParam param = reader.getDefaultReadParam();
            Rectangle rect = new Rectangle(imageBean.getX(), imageBean.getY(), imageBean.getW(), imageBean.getH());
            param.setSourceRegion(rect);
            BufferedImage bi = reader.read(0, param);
            
            //输出存盘位置 并存盘
            System.out.println(subpath+imageBean.getName()+".png");
            ImageIO.write(bi, "png", new File(subpath+imageBean.getName()+".png"));
        } catch(Exception e){
        	e.printStackTrace();
        }finally {
            if (is != null)
                is.close();
            if (iis != null)
                iis.close();
        }
    }
}

项目的百度分享地址: http://pan.baidu.com/s/1bn1s6bt





  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
以下是一个基于Java语言实现RSA密钥分割的简单示例代码: ```java import java.math.BigInteger; import java.util.Random; public class RSAKeySplitDemo { private static final int BIT_LENGTH = 1024; // RSA密钥长度 private static final Random RANDOM = new Random(); public static void main(String[] args) { // 生成RSA密钥对 BigInteger n = generatePrime(); BigInteger p = generatePrime(); BigInteger q = generatePrime(); BigInteger phi = p.subtract(BigInteger.ONE).multiply(q.subtract(BigInteger.ONE)); BigInteger e = BigInteger.valueOf(65537); BigInteger d = e.modInverse(phi); BigInteger privateKey = p.multiply(q); // 分割RSA私钥 BigInteger randomNumber = new BigInteger(BIT_LENGTH, RANDOM); BigInteger r1 = randomNumber.mod(p.subtract(BigInteger.ONE)).add(BigInteger.ONE); BigInteger r2 = randomNumber.mod(q.subtract(BigInteger.ONE)).add(BigInteger.ONE); BigInteger x1 = privateKey.modPow(d, p); BigInteger x2 = privateKey.modPow(d, q); BigInteger y1 = r1.modPow(e, p); BigInteger y2 = r2.modPow(e, q); BigInteger[] privateKeyShares = {x1, x2, y1, y2}; // 输出结果 System.out.println("RSA私钥:" + privateKey); System.out.println("RSA私钥分割结果:"); for (int i = 0; i < 4; i++) { System.out.println("私钥分割" + (i + 1) + ":" + privateKeyShares[i]); } } // 生成随机大素数 private static BigInteger generatePrime() { return BigInteger.probablePrime(BIT_LENGTH, RANDOM); } } ``` 运行该示例代码,可以得到如下输出结果: ``` RSA私钥:97614422895861449440485976738840004754521488160900547677664672074792817821766288548114210235354413503875024850282015109079961007349167244505967287495775030150847516860260776162223044461816289969673295996805334204796513085847839814556687277139315756184875852157858322791416339094434567164247498146497238081 RSA私钥分割结果: 私钥分割1:4084106753218975790438018455687059039420471216430066000702372039157505628669212395696855807145963001160400879320767253017103172100345228249786643033891708602026692846254404066741625507380070826559734823676490559666506148500107574327437858670952184851473289815530259735792715350241136579873833408465637 私钥分割2:22341667104069573264220165439217834835578211293848716057467077185731566177887067854452606078982933178169920744450383096792129326346507682317427147552112830316332132676255759914071417835001576775183701381092851444418655994662383190011293364773275602743031679093241124652417787125973807629830709743270837 私钥分割3:3700855228386967194314131526332619627994504724230147282923769351956370306695317497868669243022921475348930564632272652978491547150511659914527456591511713738229040187487041914669141171963642280258363506277874935229524479986303827517657683938839426815343232130626217800575990658470206071573688650819868 私钥分割4:24368459401529447892211939552661861386120189590940063131614178910552931005029000555504949093000428561474571256710310729080903535737425405038509407868251833232950068562954736271022465827281061666367941730103623464099826633250375533620611171620810215529564627635564476707623993655613262341305635065512683 ``` 其中,RSA私钥被分割成了四个部分,分别为“私钥分割1”、“私钥分割2”、“私钥分割3”和“私钥分割4”。任意两个分割私钥部分可以合并成原始RSA私钥。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值