位图切割器:

    虽然网上有类似的工具,PhotoShop 也有类似功能,但前者似乎不支持超大位图切割(以 G 计大小),而后者的切割块数量好像有比较小的限定范围,于是自己动手写了这个工具。

    至于为什么是“位图”切割器,原因只是我实在不想费力去解析譬如 JPG、PNG、TGA 等图像格式,而大家都知道解析 BMP 文件比较简单。

    核心处理代码很简单,无外乎 ReadFile、SetFilePointer 等之类 API 调用而已。

function HandleSplit(const FileName, DstPath, ImgName: string;
UnitW, UnitH: Integer): Boolean;
var
Handle : Integer;
FileHeader : TBitmapFileHeader;
BmpInfoHeader: TBitmapInfoHeader;
Offset : Integer;
VOffset : Integer;
Mem, DstMem : TMemoryStream;
LineLen : Integer;
PerBits : Integer;
I, J, W, H : Integer;
X, Y : string; procedure ReadAreaImgData(L, T, W, H: Integer; Dst: PByte);
var
N : Integer;
Len: Integer;
begin
Len := W * PerBits;
for N := VOffset + T to VOffset + T + H - do
begin
FileSeek(Handle, Offset + LineLen * N + L * PerBits, );
FileRead(Handle, Dst^, Len);
Inc(Dst, Len);
end;
end; begin
Result := False; Handle := FileOpen(FileName, fmOpenRead or fmShareDenyWrite);
if Handle < then
Exit; try
if FileRead(Handle, FileHeader, SizeOf(FileHeader)) <> SizeOf(FileHeader) then
Exit; if FileHeader.bfType <> $4D42 then
Exit; if FileRead(Handle, BmpInfoHeader, SizeOf(BmpInfoHeader)) <> SizeOf(BmpInfoHeader) then
Exit; case BmpInfoHeader.biBitCount of
:
begin
PerBits := ;
end;
:
begin
PerBits := ;
end;
:
begin
PerBits := ;
end
else
Exit;
end; Offset := SizeOf(FileHeader) + SizeOf(BmpInfoHeader);
VOffset := BmpInfoHeader.biHeight - BmpInfoHeader.biHeight div UnitH * UnitH;
LineLen := (BmpInfoHeader.biWidth * PerBits + ) div * ;
Mem := TMemoryStream.Create;
DstMem := TMemoryStream.Create; W := BmpInfoHeader.biWidth div UnitW;
H := BmpInfoHeader.biHeight div UnitH;
for J := to H - do
begin
for I := to W - do
begin
X := Format('%.3d', [I]);
Y := Format('%.3d', [H - - J]);
Mem.Clear;
Mem.SetSize(UnitW * PerBits * UnitH);
Mem.Position := ;
ReadAreaImgData(I * UnitW, J * UnitH, UnitW, UnitH, Mem.Memory);
DstMem.Clear;
DstMem.Write(FileHeader, SizeOf(FileHeader));
BmpInfoHeader.biWidth := UnitW;
BmpInfoHeader.biHeight := UnitH;
BmpInfoHeader.biSizeImage := ;
DstMem.Write(BmpInfoHeader, SizeOf(BmpInfoHeader));
DstMem.Write(Mem.Memory^, Mem.Size);
DstMem.SaveToFile(ImgName + '_' + Y + '_' + X + '.bmp');
end;
end; FreeAndNil(Mem);
FreeAndNil(DstMem); Result := True;
finally
FileClose(Handle);
end;
end;

    工具下载链接在这里

  位图裁剪器:写这个程序的初衷是因找不到方便的图片截取工具,尤其是在需要精确裁剪较大的图片时——这里的“较大”,和上文的切割器不一样,它不大可能能裁剪以 G 计大小的位图——这个工具写得较早些,当时没考虑支持超大图片,现在也没意愿去改进了。

    此工具的下载链接在这里

位图切割器&位图裁剪器的更多相关文章

  1. android 开发 View _13 绘制图片与BitmapShader位图的图像渲染器

    BitmapShader位图的图像渲染器 TileMode 模式 Shader.TileMode.CLAMP 边缘拉伸. Shader.TileMode.MIRROR 在水平方向和垂直方向交替景象, ...

  2. 疯狂位图之——位图生成12GB无重复随机乱序大整数集

    上一篇讲述了用位图实现无重复数据的排序,排序算法一下就写好了,想弄个大点数据测试一下,因为小数据在内存中快排已经很快. 一.生成的数据集要求 1.数据为0--2147483647(2^31-1)范围内 ...

  3. 疯狂位图之——位图实现12GB无重复大整数集排序

    <Programming Pearls>(编程珠玑)第一章讲述了如何用位图排序无重复的数据集,整个思想很简洁,今天实践了下. 一.主要思想 位图排序的思想就是在内存中申请一块连续的空间作为 ...

  4. 位图 c++ 位图排序

    什么是位图?来自http://www.cnblogs.com/dolphin0520/archive/2011/10/19/2217369.html 位图就是用一个bit来标记某个元素对应的值,键值就 ...

  5. Atitit 索引技术--位图索引

    Atitit 索引技术--位图索引 索引在数据结构上可以分为三种B树索引.位图索引和散列索引 存储原理 编辑 位图索引对数据表的列的每一个键值分别存储为一个位图,Oracle对于不同的版本,不同的操作 ...

  6. Quartz2D 编程指南(四)位图与图像遮罩、CoreGraphics 绘制 Layer

    概览 图形上下文 路径 颜色与颜色空间 变换 图案 阴影 渐变 透明层 Quartz 2D 中的数据管理 位图与图像遮罩 CoreGraphics 绘制 Layer 位图与图像遮罩 简介 位图与图像遮 ...

  7. Oracle索引——位图索引

    1.语法create bitmap index index_name on 表名(字段);2.举个例子你就能明白了:如有表 test(id,name,address)数据(1,张三,大连)(2,李四, ...

  8. 数据库 Hash Join的定义,原理,算法,成本,模式和位图

    Hash Join只能用于相等连接,且只能在CBO优化器模式下.相对于nested loop join,hash join更适合处理大型结果集       Hash Join的执行计划第1个是hash ...

  9. 第14章 位图和位块传输_14.4 GDI位图对象(3)

    14.4.10 非矩形的位图图像 (1)“掩码”位图——单色位图,要显示的像素对应的掩码置1,不显示置0(2)光栅操作(点这里,见此文分析) (3)MaskBlt函数 ①MaskBlt(hdcDest ...

随机推荐

  1. Android下百度地图开发(一):基础地图展示

    最终效果如: 这个需要详细说下,准备工作较为繁琐. 第一步:去百度申请一个开发者账号,新建一个android应用,会让你输入开发者SHA1,目前我只拿到开发版SHA1,发布版那里也填的是这个. 获取方 ...

  2. 使用二级域名访问本地localhost网站

    将C:\Windows\System32\drivers\etc\hosts文件,修改如下.保存该文件时会提示没有权限,解决的方法是用管理员权限打开记事本. # localhost name reso ...

  3. Another MySQL daemon already running with the same unix socket的解决

    问题出现: 每周一需要备份一次数据库,即从服务器MySQL导出sql文件,再导入到我机器上虚拟机的MySQL里.但是今天早上连不上,我进入控制台用#service mysqld start强行启动,报 ...

  4. Python开发程序:选课系统-改良版

    程序名称: 选课系统 角色:学校.学员.课程.讲师要求:1. 创建北京.上海 2 所学校2. 创建linux , python , go 3个课程 , linux\py 在北京开, go 在上海开3. ...

  5. C#写入日志信息到文件中

    为了在服务器上运行程序及时的跟踪出错的地方,可以在必要的地方加入写日志的程序. string folder = string.Format(@"D:\\{0}\\{1}", Dat ...

  6. Nginx location 匹配顺序整理

    Nginx location模块整理 具体的Nginx安装就不在这里描述了,这里只是为了对location的描述 Nginx环境 a. 查看当前系统cat /etc/redhat-release [r ...

  7. LazyMan的Promise解法

    背景 见上一篇. 面向对象的链式调用中,掺杂了 一个一部动作, 对于这种工作链, 是非同步执行的链. LazyMan("Hank").sleep(1).eat("dinn ...

  8. JFinal学习

    1 jfinal-1.9-bin.jar 2 继承Controller编写控制器 public void sendJPushToXXX() { String userId = getPara(&quo ...

  9. Css定位之relative_慕课网课程笔记

    前言 最近在慕课网上跟着张鑫旭大神重新学习一遍CSS相关的知识,以下是学习的笔记以及个人一些理解 relative对绝对定位的限制 1.限制绝对定位 绝对定位的top.left.right和botto ...

  10. JAVA静态代码审查之checkstyle

    技术总监来巡查,刚巧前段时间遇到了一个问题还没解决,就拉着大牛开问.结果,问题是解决了,还附带了另一个问题,或是要求出来,没啥技术含量,但是很麻烦的一个东西:代码格式. 之前我写代码,因为屏幕比较小, ...