位图切割器:

    虽然网上有类似的工具,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. springmvc配置多视图 - tiles, velocity, freeMarker, jsp

    转自: http://www.cnblogs.com/shanheyongmu/p/5684595.html <!-- Velocity --> <bean id="vel ...

  2. Foreach遍历

    前天在项目中遇到一个问题,foreach遍历过程中修改responses中的对象,其中responses的类型:IEnumerable<Order>,代码如下: foreach (Orde ...

  3. Hibernate操作指南-搭建一个简单的示例(基于Java Persistence API JPA)

  4. 【转】Linux下apache/httpd服务启动与停止

    apache服务,或者说httpd服务,如何启动,如何开机启动. 转来转去,找不到原文.. 操作系统环境:红帽5,具体如下:# uname -a Linux machine1 2.6.18-164.e ...

  5. lua协程一则报错解决“attempt to yield across metamethod/C-call boundary”

    问题 attempt to yield across metamethod/C-call boundary 需求跟如下帖子中描述一致: http://bbs.chinaunix.net/forum.p ...

  6. (转)SVN服务器搭建和使用(一)

    Subversion是优秀的版本控制工具,其具体的的优点和详细介绍,这里就不再多说. 首先来下载和搭建SVN服务器. 现在Subversion已经迁移到apache网站上了,下载地址: http:// ...

  7. 浏览器桌面通知--Notification

    前言 最近项目上要用到浏览器桌面通知,之前虽然知道有这个东西,但是一直没有用过,借此机会了解下桌面通知的机制,在此分享下. 1.权限 首先需要明确的是,不是所有网页都可以发桌面通知的,不然不得烦死,那 ...

  8. Design and Analysis of Algorithms_Fundamentals of the Analysis of Algorithm Efficiency

    I collect and make up this pseudocode from the book: <<Introduction to the Design and Analysis ...

  9. 点餐系统3个sprint的团队贡献分

    第一次冲刺贡献分   团员名字 贡献分 麦锦俊 18分 冯婉莹 21分 李康梅 19分 张鑫相 20分 曹嘉琪 22分     第二次冲刺贡献分   团员名字 贡献分 麦锦俊 19分 冯婉莹 20分 ...

  10. 15.用PHP写出显示客户端IP与服务器IP的代码,如何防止用户使用代理的情况?[添加更多详情]

    打印客户端IP:echo $_SERVER[‘REMOTE_ADDR’]; 或者: getenv('REMOTE_ADDR'); 打印服务器IP:echo gethostbyname("ww ...