C#实现自动切割图片

由于做一个TD游戏需要一些图片素材,可是现有的从网上下载的<保卫萝卜>的图片资源是多张图片合在一起的,并且没有什么规则,虽然有 个xml文件似乎用来描述此图片内子图片位置大小等信息,但由于不想花太多时间在研究这个xml文件内容上,所以转变思路想写一个根据透明的边界自动分割 图片的工具.

实现了,基本满足需要.

主界面:

Qie()是开始切图第一个函数,遍历图片每个像素,找到不是透明的就开始切图.

    void Qie()
        {

            for (int x = 0; x < bmp.Width; x++)
            {
                for (int y = 0; y < bmp.Height; y++)
                {
                    if (isT(x,y ))
                    {

                    }
                    else
                    {
                        int maxY = 0, maxX = 0, minX = 9999, minY = 9999;
                        StartQie(x,y,ref minX,ref maxX,ref minY,ref maxY);
                        if (maxY != 0)
                        {
                            JianQie(minX, maxX, minY, maxY);
                        }
                    }
                }
            }
        }

StartQie是一个递归函数,目的查找与当前像素相连并且非透明的像素,判断她的位置是否比当前的范围要大,是则更新当前最大范围.

最后切割图片的大小就是最大范围的大小.

    void StartQie(int x2, int y2 , ref int minX,ref int maxX, ref int minY,ref int maxY)
        {
            List<Point> ps = new List<Point>();
            Find(x2, y2,ref ps);

            foreach (var a in ps)
            {
                if (a.X < minX) minX = a.X;
                if (a.Y < minY) minY = a.Y;
                if (a.X > maxX) maxX = a.X;
                if (a.Y > maxY) maxY = a.Y;
            }
            //return;
            for (int x = minX; x <= maxX; x++)
            {
                for (int y = minY; y <=maxY; y++)
                {
                    if (Conten(ps, x, y)) continue;
                    if (isT(x, y) == false)
                    {
                        StartQie(x2, y2, ref minX, ref maxX, ref minY, ref maxY);
                    }
                }
            }

        }
  //这个函数用来切割图片,根据给定范围,从母图上切出子图并保存本地.

 void JianQie(int minX, int maxX,int minY,  int maxY)
        {
            i++;
            var w = maxX - minX;
            var h = maxY - minY;
            var img = new Bitmap(w,h);
            Graphics g = Graphics.FromImage(img);
            g.PageUnit = GraphicsUnit.Pixel;
            g.DrawImage(bmp, new RectangleF(0, 0, w, h), new RectangleF(minX, minY, w, h), GraphicsUnit.Pixel);
            img.Save(bp+"/"+ i + ".png",
                 System.Drawing.Imaging.ImageFormat.Png);
            for (int x = minX; x <= maxX; x++)
            {
                for (int y = minY; y <= maxY; y++)
                {
                    bmp.SetPixel(x,y,Color.Transparent);
                }
            }
        }

这是最后一个比较重要的函数,定义8个方向,Find方法用于根据8个方向查找相连且不透明的像素,找到就加入List中.

  int[,] csz = new int[8, 2] { { 0, 1 }, { 0, -1 }, { -1, 0 }, { 1, 0 }, { 1, 1 }, { 1, -1 }, { -1, -1 }, { -1, 1 } };

        void Find(int x,int y ,ref List<Point> ps){

            for (int i = 0; i < 8; i++)
            {
                int zy = csz[i, 0];
                int sx = csz[i, 1];
                var nx=x+1*zy;
                var ny=y+1*sx;
                if (Conten(ps,nx,ny)==false && nx > -1 && nx < bmp.Width && ny > -1 && ny < bmp.Height && isT(nx, ny)==false)
                {
                    ps.Add(new Point(nx,ny));
                    Find(nx, ny ,ref ps);
                }
            }
        }

小软件,有时候却很有用.目前不足是:不能自动识别小元素,这个其实很好解决,但当时目的已经基本实现便没有多花时间来解决这个问题.

切出来的图:

时间: 2024-08-03 13:30:05

C#实现自动切割图片的相关文章

JQury自动切换图片

[标签]Jquery图片自动切换<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head><meta http-equiv=&

两种方法实现用CSS切割图片只取图片中一部分

切割图片这里不是真正的切割,只是用CSS取图片中的一部分而已,主要有两种方式,一是做为某一元素的背景图片,二是用img元素的属性.下面有个不错的示例,大家可以参考下 切割图片这里不是真正的切割,只是用CSS取图片中的一部分而已.这样做的好处就是减少了打开网页时请求图片的次数.主要有两种方式,一是做为某一元素的背景图片,二是用img元素的属性. 方法一: 用CSS中元素的background : background-color || background-image || background-

Android 中通过切割图片创建人物行走动画

以前一直使用序列图片来实现动画效果,造成空间的极大浪费,所以想要尝试下切割图片来实现动画. 如图所示,是由66rpg纸娃娃系统生成的角色行走图.本程序必须实现将人物的整体图片切割后存入4x4的数组来动态加载. 在主布局文件中设立4个ImageView,分别用来显示角色在不同角度下的行走动作.然后在主活动文件中: public class MainActivity extends ActionBarActivity {private ImageView myImageView,myImageVie

【跟我一起学Unity3D】代码中切割图片并且加载帧序列动画

在Cocos2dx中,对大图的处理已经封装好了一套自己的API,但是在Unity3D中貌似没有类似的API,或者说我没找到.不过这也在情理之中,毕竟Unity3D是做3D的,要切割图片的地方还是很少的. 因为我用Unity3D主要是用于做2D游戏的(PS:很蛋疼吧?我也觉得),所以就不得不考虑切图和播放序列帧这两个在2D上常见的功能了,下面废话不多说.我的任务是把下面这张图切割成16块,并且按照动画的序列播放出来. 查Unity3D的使用手册的过程中,我发现了一个类:Texture2D,他是继承

关于自动切换图片

在<head>与</head>之间输入以下代码 <script language="javascript"> var img = new array(3); //创建数组 var num = 0; if(document.images){ for(i=1;i<=3;i++){ img[i] = new image();//创建对象实例 img[i].src = "images/00" + i +".jpg"

Android调用相册拍照控件实现系统控件缩放切割图片

android 下如果做处理图片的软件 可以调用系统的控件 实现缩放切割图片 非常好的效果 今天写了一个demo分享给大家 package cn.m15.test; import java.io.ByteArrayOutputStream;import java.io.File;import android.app.Activity;import android.content.Intent;import android.graphics.Bitmap;import android.net.Ur

iOS:自动读取图片插件KSImageNamed-Xcode-master的使用

gitHub链接:https://github.com/ksuther/KSImageNamed-Xcode KSImageNamed-Xcode是一个Xcode插件,可以帮助开发者在Xcode中自动补全图片名称.支持NSImage和UIImage.带有预览功能. 网站: http://ksuther.com/2013/01/22/ksimagenamed-xcode-autocomplete-for-imagenamed/ 当我们使用imageName这个方法时,我们可以看到图片的提示,而当我

IOS开发UI篇之自动滚动图片

我们在做项目是有时候会遇到设置自动滚动图片,所以我自己也遇到过两次.觉得他是一个挺有意思东西,所以做了下总结 DEMO: .h #import <UIKit/UIKit.h> @interface ImagePlayView : UIView<UIScrollViewDelegate> @property (nonatomic, strong) UIScrollView * scroll; @property (nonatomic, strong) UIPageControl *

带左右箭头切换的自动滚动图片JS特效

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-