位图切割器:

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

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

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

  1. function HandleSplit(const FileName, DstPath, ImgName: string;
  2. UnitW, UnitH: Integer): Boolean;
  3. var
  4. Handle : Integer;
  5. FileHeader : TBitmapFileHeader;
  6. BmpInfoHeader: TBitmapInfoHeader;
  7. Offset : Integer;
    VOffset : Integer;
  8. Mem, DstMem : TMemoryStream;
  9. LineLen : Integer;
  10. PerBits : Integer;
  11. I, J, W, H : Integer;
  12. X, Y : string;
  13.  
  14. procedure ReadAreaImgData(L, T, W, H: Integer; Dst: PByte);
  15. var
  16. N : Integer;
  17. Len: Integer;
  18. begin
  19. Len := W * PerBits;
  20. for N := VOffset + T to VOffset + T + H - do
  21. begin
  22. FileSeek(Handle, Offset + LineLen * N + L * PerBits, );
  23. FileRead(Handle, Dst^, Len);
  24. Inc(Dst, Len);
  25. end;
  26. end;
  27.  
  28. begin
  29. Result := False;
  30.  
  31. Handle := FileOpen(FileName, fmOpenRead or fmShareDenyWrite);
  32. if Handle < then
  33. Exit;
  34.  
  35. try
  36. if FileRead(Handle, FileHeader, SizeOf(FileHeader)) <> SizeOf(FileHeader) then
  37. Exit;
  38.  
  39. if FileHeader.bfType <> $4D42 then
  40. Exit;
  41.  
  42. if FileRead(Handle, BmpInfoHeader, SizeOf(BmpInfoHeader)) <> SizeOf(BmpInfoHeader) then
  43. Exit;
  44.  
  45. case BmpInfoHeader.biBitCount of
  46. :
  47. begin
  48. PerBits := ;
  49. end;
  50. :
  51. begin
  52. PerBits := ;
  53. end;
  54. :
  55. begin
  56. PerBits := ;
  57. end
  58. else
  59. Exit;
  60. end;
  61.  
  62. Offset := SizeOf(FileHeader) + SizeOf(BmpInfoHeader);
    VOffset := BmpInfoHeader.biHeight - BmpInfoHeader.biHeight div UnitH * UnitH;
  63. LineLen := (BmpInfoHeader.biWidth * PerBits + ) div * ;
  64. Mem := TMemoryStream.Create;
  65. DstMem := TMemoryStream.Create;
  66.  
  67. W := BmpInfoHeader.biWidth div UnitW;
  68. H := BmpInfoHeader.biHeight div UnitH;
  69. for J := to H - do
  70. begin
  71. for I := to W - do
  72. begin
  73. X := Format('%.3d', [I]);
  74. Y := Format('%.3d', [H - - J]);
  75. Mem.Clear;
  76. Mem.SetSize(UnitW * PerBits * UnitH);
  77. Mem.Position := ;
  78. ReadAreaImgData(I * UnitW, J * UnitH, UnitW, UnitH, Mem.Memory);
  79. DstMem.Clear;
  80. DstMem.Write(FileHeader, SizeOf(FileHeader));
  81. BmpInfoHeader.biWidth := UnitW;
  82. BmpInfoHeader.biHeight := UnitH;
  83. BmpInfoHeader.biSizeImage := ;
  84. DstMem.Write(BmpInfoHeader, SizeOf(BmpInfoHeader));
  85. DstMem.Write(Mem.Memory^, Mem.Size);
  86. DstMem.SaveToFile(ImgName + '_' + Y + '_' + X + '.bmp');
  87. end;
  88. end;
  89.  
  90. FreeAndNil(Mem);
  91. FreeAndNil(DstMem);
  92.  
  93. Result := True;
  94. finally
  95. FileClose(Handle);
  96. end;
  97. 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. 【vue.js权威指南】读书笔记(第一章)

    最近在读新书<vue.js权威指南>,一边读,一边把笔记整理下来,方便自己以后温故知新,也希望能把自己的读书心得分享给大家. [第1章:遇见vue.js] vue.js是什么? vue.j ...

  2. windows + python + dlib

    我试了网上的各种教程,结果都是屁话 pip install dlib

  3. async 和 await小结

    三大返回值: 返回类型 - Task<TResult> 返回类型 - Task 返回类型 - void 当你添加 async 关键字后,需要返回一个将用于后续操作的对象,请使用 Task& ...

  4. 二、oracle数据库成功安装步骤 配置监听器

      Oracle数据库使用监听器来接收客户端的连接请求,要使客户端能连接Oracle数据库,必须配置监听程序. 在安装Oracle数据库时,如果选择的是"创建和配置数据库",则安装 ...

  5. Python之路-(Django进阶一)

    Django请求生命周期: 首先,客户端发送请求到服务器的urls库,通过匹配url后面的关键字,去找指定app里面的的view. 然后,app通过判断,拿到数据库数据和html模板文件. 最后,将拿 ...

  6. UE4入门与精通

    由于目前在使用UE4引擎,多少也有一些心得,比如在日常使用中会遇到一些问题.坑(潜规则)或者一些使用技巧等.本人决定开一个大坑,主要有两个目的:一是可以自己做个记录,二是可以给大家提供一些参考吧.主要 ...

  7. expdp ORA-31693 ORA-31617 ORA-19505 ORA-27037

    使用expdp并行导出数据的时候报如下错误: Connected to: Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64b ...

  8. windows远程控制ubuntu---基于ssh

    要实现windows下连接ubuntu需要安装以下软件: 1. windows下安装winSCP 2. Ubuntu下安装OpenSSH Server 可以使用命令行安装openSSH Server: ...

  9. Emmet使用之HTML

    前言 前段时间在网上发现一个强大的好玩的东西,emmet,它可以方便我们前端开发者快速编写html和css.可以算是前端开发必备的一款利器,今天先总结一下用emmet写html,有时间再总结下css的 ...

  10. rhel 7.0, windows10双系统grub2设置

    因为在win10基础上装了rhel7,但是启动时却没有win10的启动项,下面的方法解决此问题. $ su #root登录 $ cd /boot/grub2 1. 简单执行grub2-mkconfig ...