C# GDI+ 实现图片分隔

1. 概述

有时候我们需要在web页面上显示一张图,比如说一张地图,而这张地图会比较大。这时候如果我们把一张大图分隔成一组小图,那么客户端的显示速度会明显地感觉块。希望阅读本文对你有所帮助。

2. 实现思路

.NET Framework GDI+ 为我们提供了一组丰富地类来编辑图形图像。有关.NET Framework GDI+的详细资料请查阅msdn相关文档。这里只简要叙述本程序要用的的几个类。

System.Drawing.Image.LoadFile方法可以从指定的文件创建 Image 对象。System.Drawing.Image.Save方法可以将此 Image 对象保存到指定文件。System.Drawing.Image.Width和System.Drawing.Image.Height属性可以得到图片的宽度和高度。
System.Drawing.Graphics类可以编辑图像。System.Drawing.Graphics.DrawImage方法在指定位置并且按指定大小绘制指定的 Image 对象的指定部分。

图片分隔说明:就是把一张大图,按指定的宽度和高度分隔成一组小图

图1

对初学者的提示:在我们读书时学过的数学坐标如图2所示,在GDI+里的坐标如图3所示

图2图3

3. 实现代码

 1public class CropImageManipulator
 2    {
 3        public CropImageManipulator()
 4        {
 5            
 6        }

 7
 8        // 不含扩展名的文件名
 9        private string _fileNameWithoutExtension;
10        // 文件扩展名
11        private string _fileExtension;
12        // 文件所属的文件夹
13        private string _fileDirectory;
14        public string Cropping(string inputImgPath, int cropWidth, int cropHeight)
15        {
16            this._fileNameWithoutExtension = System.IO.Path.GetFileNameWithoutExtension(inputImgPath);
17            this._fileExtension = System.IO.Path.GetExtension(inputImgPath);
18            this._fileDirectory = System.IO.Path.GetDirectoryName(inputImgPath);
19            
20            // 装载要分隔的图片
21            Image inputImg = Image.FromFile(inputImgPath);
22            int imgWidth = inputImg.Width;
23            int imgHeight = inputImg.Height;
24            
25            // 计算要分几格
26            int widthCount = (int)Math.Ceiling((imgWidth * 1.00/ (cropWidth * 1.00));
27            int heightCount = (int)Math.Ceiling((imgHeight * 1.00/ (cropHeight * 1.00));
28            //----------------------------------------------------------------------
29            ArrayList areaList = new ArrayList();
30            
31            System.Text.StringBuilder sb = new System.Text.StringBuilder();
32            sb.Append("<table cellpadding='0' cellspacing='0' border='[$border]'>");
33            sb.Append(System.Environment.NewLine);
34
35            int i = 0;
36            for (int iHeight = 0; iHeight < heightCount ; iHeight ++)
37            {
38                sb.Append("<tr>");
39                sb.Append(System.Environment.NewLine);
40                for (int iWidth = 0; iWidth < widthCount ; iWidth ++)
41                {
42                    //string fileName = "<img src='http://localhost/SRcommBeijingFile/" + this._fileNameWithoutExtension + " _" + i.ToString() + this._fileExtension + "'>";
43                    string fileName = string.Format("<img src='http://localhost/SRcommBeijingFile/{0}_{1}{2}' />",this._fileNameWithoutExtension,i,this._fileExtension);
44                    sb.Append("<td>" + fileName + "</td>");
45                    sb.Append(System.Environment.NewLine);
46
47
48                    int pointX = iWidth * cropWidth;
49                    int pointY = iHeight * cropHeight;
50                    int areaWidth = ((pointX + cropWidth) > imgWidth) ? (imgWidth - pointX) : cropWidth;
51                    int areaHeight = ((pointY + cropHeight) > imgHeight) ? (imgHeight - pointY) : cropHeight;
52                    string s = string.Format("{0};{1};{2};{3}",pointX,pointY,areaWidth,areaHeight);
53                    
54                    Rectangle rect = new Rectangle(pointX,pointY,areaWidth,areaHeight);
55                    areaList.Add(rect);
56                    i ++;
57                }

58                sb.Append("</tr>");
59                sb.Append(System.Environment.NewLine);
60            }

61
62            sb.Append("</table>");
63
64            
65            //----------------------------------------------------------------------    
66            
67            for (int iLoop = 0 ; iLoop < areaList.Count ; iLoop ++)
68            {
69                Rectangle rect = (Rectangle)areaList[iLoop];
70                string fileName = this._fileDirectory + "//" + this._fileNameWithoutExtension + "_" + iLoop.ToString() + this._fileExtension;
71                Bitmap newBmp = new Bitmap(rect.Width,rect.Height,PixelFormat.Format24bppRgb);
72                Graphics newBmpGraphics = Graphics.FromImage(newBmp);
73                newBmpGraphics.DrawImage(inputImg,new Rectangle(0,0,rect.Width,rect.Height),rect,GraphicsUnit.Pixel);
74                newBmpGraphics.Save();
75                switch (this._fileExtension.ToLower())
76                {
77                    case ".jpg":
78                    case ".jpeg":
79                        newBmp.Save(fileName,ImageFormat.Jpeg);
80                        break;
81                    case "gif":
82                        newBmp.Save(fileName,ImageFormat.Gif);
83                        break;
84                }

85                
86            }

87            inputImg.Dispose();
88            string html = sb.ToString();
89            return html;
90        }

91
92    }
 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/408005.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

c/c++面试试题(一)

1.求下面函数的返回值&#xff08;微软&#xff09;int func(x) { int countx 0; while(x) { countx ; x x&(x-1); } return countx; } 假定x 9999。 答案&#xff1a;8思路&#xff1a;将x转化为2进制&#xff0c;看含有的1…

2. Get the codes from GIT

Clone the code from git. Click the “GitEx Clone”. Paste the url into the “Repository to clone”. You can get the route from git repository from it: https://msstash.companydomainname.com/ .Find the project which you want to download and then click the “…

The Ranges Library (2) --- C++20

The Ranges Library (2) — C20 比较std与std::ranges算法 比较一下std::sort和std::ranges::sort std::sort template< class RandomIt > constexpr void sort( RandomIt first, RandomIt last );template< class ExecutionPolicy, class RandomIt > void sor…

WPF中的动画

WPF中的动画 周银辉动画无疑是WPF中最吸引人的特色之一&#xff0c;其可以像Flash一样平滑地播放并与程序逻辑进行很好的交互。这里我们讨论一下故事板。在WPF中我们采用Storyboard&#xf…

[访问系统] Api_Win32_Mac类工具包 (转载)

点击下载 Api_Win32_Mac.zip using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Runtime.InteropServices;namespace BaseFunction {class API{[DllImport("kernel32")]//内存public static extern void GlobalM…

constexpr 函数

constexpr 函数 — C 20 constexpr double pi 3.14;constexpr允许你在编译时使用典型的C函数语法进行编程,但这并不意味之constexpr只和编译期有关 constexpr函数可以在编译期运行,也可以在运行时运行 但在以下情况constexpr函数必须在编译期运行: constexpr函数在编译的上…

constexpr和consteval --- C++ 20

constexpr和consteval — C 20 标准库容器和算法库对constexpr 的应用 C20 中大量的算法和容器可以使用constexpr,这意味着你甚至可以再编译期vector<int>进行排序 Algorithms library - cppreference.com 如下: #include <iostream> #include <ranges>…

函数模板(参考《C++ Templates 英文版第二版》)

函数编程(参考《C Templates 英文版第二版》) Chapter 1 函数模板 1.1 一窥函数模板 template<class T> T max(T a, T b) {return b < a ? a : b; }#include "max1.hpp" #include <iostream> #include <string> #include <format>int…

Curiously Recurring Template Pattern奇怪的模板递归 --- C++20

Curiously Recurring Template Pattern 奇怪的模板递归 — C20 我们都知道C有静态多态和动态多态,动态多态通过虚函数表实现,他的缺点就是对效率产生一点点影响 可以用CRTP解决这个问题 我们先举一个动态多态的例子: #include <iostream> using namespace std;class …

PROJECT #0 - C++ PRIMER [CMU 15-445645]笔记

PROJECT #0 - C PRIMER [CMU 15-445/645]笔记 这是数据库领域的一门课程, 由卡内基梅隆大学副教授Andy Pavlo授课, 目前在网上有授课视频资料、实验以及配套的在线测评环境 (限时开放至2021年12月31日) 环境: wsl2 Clion Project #0 - C Primer 还是很简单的,主要目的是让…

简单JS实现对表的行的增删

这段代码非常的简单&#xff0c;仅仅作为自己的一个小小的记录&#xff01; ok&#xff0c;先上一个简单的图例&#xff0c;效果如下&#xff08;注意&#xff1a;这只是一个简单的例子&#xff0c;不过可以根据这个简单的例子&#xff0c;变化出更为复杂的效果&#xff09;&am…