位图切割器&位图裁剪器
位图切割器:
虽然网上有类似的工具,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 ...
随机推荐
- 【vue.js权威指南】读书笔记(第一章)
最近在读新书<vue.js权威指南>,一边读,一边把笔记整理下来,方便自己以后温故知新,也希望能把自己的读书心得分享给大家. [第1章:遇见vue.js] vue.js是什么? vue.j ...
- windows + python + dlib
我试了网上的各种教程,结果都是屁话 pip install dlib
- async 和 await小结
三大返回值: 返回类型 - Task<TResult> 返回类型 - Task 返回类型 - void 当你添加 async 关键字后,需要返回一个将用于后续操作的对象,请使用 Task& ...
- 二、oracle数据库成功安装步骤 配置监听器
Oracle数据库使用监听器来接收客户端的连接请求,要使客户端能连接Oracle数据库,必须配置监听程序. 在安装Oracle数据库时,如果选择的是"创建和配置数据库",则安装 ...
- Python之路-(Django进阶一)
Django请求生命周期: 首先,客户端发送请求到服务器的urls库,通过匹配url后面的关键字,去找指定app里面的的view. 然后,app通过判断,拿到数据库数据和html模板文件. 最后,将拿 ...
- UE4入门与精通
由于目前在使用UE4引擎,多少也有一些心得,比如在日常使用中会遇到一些问题.坑(潜规则)或者一些使用技巧等.本人决定开一个大坑,主要有两个目的:一是可以自己做个记录,二是可以给大家提供一些参考吧.主要 ...
- expdp ORA-31693 ORA-31617 ORA-19505 ORA-27037
使用expdp并行导出数据的时候报如下错误: Connected to: Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64b ...
- windows远程控制ubuntu---基于ssh
要实现windows下连接ubuntu需要安装以下软件: 1. windows下安装winSCP 2. Ubuntu下安装OpenSSH Server 可以使用命令行安装openSSH Server: ...
- Emmet使用之HTML
前言 前段时间在网上发现一个强大的好玩的东西,emmet,它可以方便我们前端开发者快速编写html和css.可以算是前端开发必备的一款利器,今天先总结一下用emmet写html,有时间再总结下css的 ...
- rhel 7.0, windows10双系统grub2设置
因为在win10基础上装了rhel7,但是启动时却没有win10的启动项,下面的方法解决此问题. $ su #root登录 $ cd /boot/grub2 1. 简单执行grub2-mkconfig ...