位图切割器&位图裁剪器
位图切割器:
虽然网上有类似的工具,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 计大小的位图——这个工具写得较早些,当时没考虑支持超大图片,现在也没意愿去改进了。

此工具的下载链接在这里。
位图切割器&位图裁剪器的更多相关文章
- android 开发 View _13 绘制图片与BitmapShader位图的图像渲染器
BitmapShader位图的图像渲染器 TileMode 模式 Shader.TileMode.CLAMP 边缘拉伸. Shader.TileMode.MIRROR 在水平方向和垂直方向交替景象, ...
- 疯狂位图之——位图生成12GB无重复随机乱序大整数集
上一篇讲述了用位图实现无重复数据的排序,排序算法一下就写好了,想弄个大点数据测试一下,因为小数据在内存中快排已经很快. 一.生成的数据集要求 1.数据为0--2147483647(2^31-1)范围内 ...
- 疯狂位图之——位图实现12GB无重复大整数集排序
<Programming Pearls>(编程珠玑)第一章讲述了如何用位图排序无重复的数据集,整个思想很简洁,今天实践了下. 一.主要思想 位图排序的思想就是在内存中申请一块连续的空间作为 ...
- 位图 c++ 位图排序
什么是位图?来自http://www.cnblogs.com/dolphin0520/archive/2011/10/19/2217369.html 位图就是用一个bit来标记某个元素对应的值,键值就 ...
- Atitit 索引技术--位图索引
Atitit 索引技术--位图索引 索引在数据结构上可以分为三种B树索引.位图索引和散列索引 存储原理 编辑 位图索引对数据表的列的每一个键值分别存储为一个位图,Oracle对于不同的版本,不同的操作 ...
- Quartz2D 编程指南(四)位图与图像遮罩、CoreGraphics 绘制 Layer
概览 图形上下文 路径 颜色与颜色空间 变换 图案 阴影 渐变 透明层 Quartz 2D 中的数据管理 位图与图像遮罩 CoreGraphics 绘制 Layer 位图与图像遮罩 简介 位图与图像遮 ...
- Oracle索引——位图索引
1.语法create bitmap index index_name on 表名(字段);2.举个例子你就能明白了:如有表 test(id,name,address)数据(1,张三,大连)(2,李四, ...
- 数据库 Hash Join的定义,原理,算法,成本,模式和位图
Hash Join只能用于相等连接,且只能在CBO优化器模式下.相对于nested loop join,hash join更适合处理大型结果集 Hash Join的执行计划第1个是hash ...
- 第14章 位图和位块传输_14.4 GDI位图对象(3)
14.4.10 非矩形的位图图像 (1)“掩码”位图——单色位图,要显示的像素对应的掩码置1,不显示置0(2)光栅操作(点这里,见此文分析) (3)MaskBlt函数 ①MaskBlt(hdcDest ...
随机推荐
- 升级到macOS 10.12 mysqlb报错ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)
系统升级到macOS 10.12后启动mysql后,在终端输入mysql 报错ERROR 1045 (28000): Access denied for user 'root'@'localhost' ...
- 转:HAR(HTTP Archive)规范
HAR(HTTP Archive),是一个用来储存HTTP请求/响应信息的通用文件格式,基于JSON.这个格式的出现可以使HTTP监测工具以一种通用的格式导出所收集的数据,这些数据可以被其他支持HAR ...
- 零基础学WEB前端-CSS
CSS指层叠样式表(Cascading Style Sheets),CSS 是标准的布局语言,用来控制元素的尺寸.颜色.排版.CSS 由 W3C 发明,用来取代基于表格的布局.框架以及其他非标准的表现 ...
- 关于Entity Framework使用的简单例子
一.创建Code First模型 1.创建工程,这里我使用的是以.NET 4.0为目标的实体Web应用程序 2.安装Entity Framework 确保已安装NuGet,选择NuGet套件管理员&g ...
- 当利用pip安装模块出现错误时咋办
>在DOS窗口中到Python安装路径的scripts中执行 pip install pyperclip 出现错误 >>错误提示:Fatal error in launcher: ...
- 流量三角形:并非简单的"统计学"
又忙了一周多,今天过来再整理一些东西.国内做产险精算的,准备金的居多,从精算部落中的帖子的跟帖情况可见一斑.既然准备金更容易受到大家的关注,今天再整理一个关于准备金的个人看法,给精算部落收敛一下人气, ...
- Computop支付网关(一) credit Card
1.界面没有中文,只能选择英文 sp – Spanish; en – English; ca – Catalan; fr – French; de – German; du – Dutch; it – ...
- C语言堆和栈
堆和栈的区别 一个由C/C++编译的程序占用的内存分为以下几个部分1.栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等.其操作方式类似于数据结构中的栈.2.堆区(heap ...
- c#中事物使用
数据库事务(简称: 事务)是数据库管理系统执行过程中的一个逻辑单位,由一个有限的数据库操作序列构成.当事务被提交给了DBMS(数据库管理系统),则DBMS(数据库管理系统)需要确保该事务中的所有操作都 ...
- PHP设计模式之:单例模式
前 些日子开始着真正的去了解下设计模式,开始么,简单地从单例模式开始,当然网上看了一些资料,单例模式比较好理解,看看介绍,然后看看代码基本也就能够理 解了,设计模式这些的花点心思基本的是能够理 ...