整个程序不就是最后的那个方法是关键。。。大概意思应该是通过 传值过来的行列值 ,然后和一开始设定的行列值比较,如果 n的值等于1 ,返回 TURE ,也就是要嘛图案移动了 一行,或者一列,
如果返回值是false 就是行列值没变
public static void cut(String srcImageFile, String descDir, int destWidth,
int destHeight) {
try {
Image img;
ImageFilter cropFilter;
// 读取源图像
BufferedImage bi = ImageIOread(new File(srcImageFile));
int srcWidth = bigetHeight(); // 源图宽度
int srcHeight = bigetWidth(); // 源图高度
if (srcWidth > destWidth && srcHeight > destHeight) {
Image image = bigetScaledInstance(srcWidth, srcHeight,
ImageSCALE_DEFAULT);
destWidth = 200; // 切片宽度
destHeight = 150; // 切片高度
int cols = 0; // 切片横向数量
int rows = 0; // 切片纵向数量
// 计算切片的横向和纵向数量
if (srcWidth % destWidth == 0) {
cols = srcWidth / destWidth;
} else {
cols = (int) Mathfloor(srcWidth / destWidth) + 1;
}
if (srcHeight % destHeight == 0) {
rows = srcHeight / destHeight;
} else {
rows = (int) Mathfloor(srcHeight / destHeight) + 1;
}
// 循环建立切片
// 改进的想法:是否可用多线程加快切割速度
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++) {
// 四个参数分别为图像起点坐标和宽高
// 即: CropImageFilter(int x,int y,int width,int height)
cropFilter = new CropImageFilter(j 200, i 150,
destWidth, destHeight);
img = ToolkitgetDefaultToolkit()createImage(
new FilteredImageSource(imagegetSource(),
cropFilter));
BufferedImage tag = new BufferedImage(destWidth,
destHeight, BufferedImageTYPE_INT_RGB);
Graphics g = taggetGraphics();
gdrawImage(img, 0, 0, null); // 绘制缩小后的图
gdispose();
// 输出为文件
ImageIOwrite(tag, "JPEG", new File(descDir
+ "pre_map_" + i + "_" + j + "jpg"));
}
}
}
} catch (Exception e) {
eprintStackTrace();
}
}
以我现在的知识,我还不知道如何更简单的去做。
但如果以实现方式来讲,
一种是人工将这种形状
一种是 非常麻烦,需要程序进行大量计算。要对转换成 int 数值 有所了解
我想我只能提供你思路,因为具体实现是比较麻烦的
因为我不是讲语文的,不知道能不能说明白,比较意识流。。。
人工将的几种形状画出一种以指定颜色背景的半透明的图,,
比如方案为
■■■■□□■■■■□□■■■■
■■■□□■■■■■■□□■■■
■■■■□□■■■■□□■■■■
■■■□□■■■■■■□□■■■
■■□■□□■□□■□□■□■■
□□□□□□□□□□□□□□□□
□□■□□□□■■□□□□■□□
■■■■□□■■■■□□■■■■
■■■□□■■■■■■□□■■■
■■■■□□■■■■□□■■■■
■■■■□□■■■■□□■■■■
我想我画的试例图你明白了吧,是可以进行对接拼图的
一个比如说红色 44大小的,那么他转成int数据时就是
0xffff0000 0xffff0000 0xffff0000 0xffff0000
0xffff0000 0xffff0000 0xffff0000 0xffff0000
0xffff0000 0xffff0000 0xffff0000 0xffff0000
0xffff0000 0xffff0000 0xffff0000 0xffff0000
0x后面的ff表示是不透明的
第二个ff及后面的4个0表示颜色前2位是红中间是绿最后是蓝 这一点你可以用photoshop去查看
比如我上面第一张图的数据,转成int 数据时,就应该是
A B C D
1 0xffff0000 0xffff0000 0xffff0000 0xffff0000
2 0xffff0000 0xffff0000 0xffff0000 0x00ffffff
3 0xffff0000 0xffff0000 0xffff0000 0xffff0000
4 0xffff0000 0xffff0000 0xffff0000 0x00ffffff
5 0xffff0000 0xffff0000 0x00ffffff 0xffff0000
其中 D2 D4 及C5的位置是透明的0x00表示透明
说到这,也就是说,你应该能通过你生成的那几个指定的获得这几个对应的数据模板
之后你将你的要拼图的,按你设计好的模板拼图方式,生成块 注意,因为你要的效果是两个对接的,所以在生成的时候,也要注意,是对接的
如果你做到这一步,(或说成,你能想明白到这一步,哪怕不知道怎么做,没关系)
你这时应该能得到每块,和每块对应的是哪种模板
将这块转成int 数组形式的 数据文件。
之后将这个数据文件与对应的模板数据文件进行对应,
当发现你的模板的数据值为0x00ffffff时,就说明这个位置的颜色应该是透明的,这时因为你的数据与模版数据ID是相对应的,直接找到数据ID,将他的值改为0x00ffffff就可以了。
到这一步,你应该可以实现将所有分割后的,在数据上转换成了你想要的样子。
这时,你只要通过一些函数将数据文件转换成格式就行了。
因为我做的是手机方面的,你用的可能是J2SE吧,API我不是很熟,不能提供具体的方法。
1在Eclipse里打开项目,右键点击项目名,选择“Properties”;
2在d出的对话框中,选择“Java Build Path”,点击“Source”;
3点击“Link Source”,选择images文件夹,点击“Finish”;
4回到项目目录,images文件夹就复制到了项目目录下eclipse里。
以上就是关于JAVA拼图中行列怎么变化的全部的内容,包括:JAVA拼图中行列怎么变化的、请问java怎样实现拼图游戏图片的载入,就是图片怎么分割成一小张一小张的,请详讲。谢谢,最好有代码、用java做拼图游戏,怎么把图片切割成不规则形状等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)