位图切割器&位图裁剪器
位图切割器:
虽然网上有类似的工具,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 ...
随机推荐
- mongodb数据库迁移
如果遇到权限问题,终极解决办法:关掉权限! 如:assertion: 18 { ok: 0.0, errmsg: "auth failed", code: 18 }等错误
- Glide请求图片能携带Cookie的哟!
在Web编程中我们都很熟知一个概念,当有了seesion登录状态时,你可以访问一些资源但如果你没有登录的话很多资源是无法访问的. 在android的WebApi中当然一样拥有这个概念.比如,用户的头像 ...
- 运用 Swing
一:Swing的组件: 组件(component,或称原件)就是你会放在GUI上的东西,这些东西用户可以看到并可以与之交互. 组件是可以嵌套的. 创建GUI的四个步骤: 1.创建window(JFra ...
- 线性时间O(n)内求数组中第k大小的数
--本文为博主原创,转载请注明出处 因为最近做的WSN(wireless sensor network)实验要求用3个传感器节点接受2000个包的数据并算出一些统计量,其中就有算出中位数这么一个要求, ...
- Mac上安装django
参考:https://docs.djangoproject.com/en/1.9/topics/install/#installing-official-release 升级pip sudo pip ...
- Win2008R2+java+tomcat安装
Win2008R2+java+tomcat安装 准备软件: jdk-7u25-windows-x64.exe apache-tomcat-7.0.42-windows-x64.zip 一.安装java ...
- gitlab改用ssh操作
1.配置ssh http://blog.csdn.net/xyzchenxiaolin/article/details/51853319http://blog.csdn.net/r8hzgemq/ar ...
- (转)HTTP 长连接和短连接
1. HTTP协议与TCP/IP协议的关系 HTTP的长连接和短连接本质上是TCP长连接和短连接.HTTP属于应用层协议,在传输层使用TCP协议,在网络层使用IP协议.IP协议主要解决网络路由和寻址问 ...
- memcpy内存复制
memcpy(predata,frame,1920*1080*4);
- android Dialog重绘
String title = ""; if(itemInfo!=null) title = "\n\""+itemInfo.itemSSID+&quo ...