delphi JPG图片 旋转 切边 缩放
unit UCutFigure_JPG;
//JPG 切图 interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, StdCtrls,Math, jpeg
; //向左旋转X度
procedure Rotate(Srcbmp, DestBmp: TBitmap; dbTheta: Double);
//毫米单位转换为英寸单位
function MmToInch(Length: Extended): Extended;
//英寸单位转换为毫米单位
function InchToMm(Length: Extended): Extended;
function CutFigure_JPG(图片文件名:string;旋转角度:integer;切边_上,切边_下,切边_左,切边_右:real;缩放_宽,缩放_高:real):Integer;
implementation function CutFigure_JPG(图片文件名:string;旋转角度:integer;切边_上,切边_下,切边_左,切边_右:real;缩放_宽,缩放_高:real):Integer;
var
JpgSrc,JpgDest : TJpegImage;
BmpSrc, BmpDest: TBitmap;
F_上,F_下,F_左,F_右,F_长,F_宽:integer;//切边值
F_缩放比率:real;
F_处理状态:boolean;
begin
//文件名,含全路径
if not FileExists(图片文件名) then exit;//文件不存在则退出 JpgSrc := TJpegImage.Create;
JpgDest:=TJpegImage.Create ;
BmpSrc:=TBitmap.Create;
BmpDest:=TBitmap.Create ; JpgSrc.LoadFromFile(图片文件名);//加载文件
BmpSrc.Assign(JpgSrc);
F_处理状态:=False;//未处理过
if 旋转角度> then
begin
Rotate(BmpSrc, BmpDest,旋转角度); //由于函数是左向旋转,所以这里角度设置为270。
F_处理状态:=true;
end; if (切边_上>) or (切边_下>) or (切边_左>) or (切边_右>) then
begin
//需要切边
if F_处理状态=true then
BmpSrc.Assign(BmpDest);
//切边传进来的参数,为cm
if 切边_上< then 切边_上:=;
if 切边_下< then 切边_下:=;
if 切边_左< then 切边_左:=;
if 切边_右< then 切边_右:=; F_上:=Round(MmToInch(切边_上)**);
F_下:=Round(MmToInch(切边_下)**);
F_左:=Round(MmToInch(切边_左)**);
F_右:=Round(MmToInch(切边_右)**); if (F_上+F_下<BmpSrc.Height) and (F_左+F_右>=BmpSrc.Width ) then
begin //值超范围,不处理
BmpDest.Height:=BmpSrc.Height-(F_上+F_下);
BmpDest.Width:=BmpSrc.Width-(F_左+F_右);
SetStretchBltMode(BmpDest.Canvas.Handle,HALFTONE);//设置指位图拉伸模式
stretchblt(BmpDest.Canvas.Handle,,,BmpDest.Width,BmpDest.Height,BmpSrc.Canvas.Handle,F_左,F_上,BmpDest.Width,BmpDest.Height,srccopy); //从源矩形中复制一个位图到目标矩形并适当压缩
F_处理状态:=true;
end ; end; if (缩放_高>) or (缩放_宽>) then
begin
//需要缩放
if F_处理状态=true then
BmpSrc.Assign(BmpDest); F_长:=Round(MmToInch(缩放_高)**);
F_宽:=Round(MmToInch(缩放_宽)**); if (F_长>) and (F_宽>) and (BmpSrc.Height>F_长) and (BmpSrc.Width >F_宽) then
begin
//如果都超过,则等比缩小到其中较大的一个值等于目标值
if (F_长/BmpSrc.Height)>(F_宽/BmpSrc.Width) then
begin
F_缩放比率:=F_宽/BmpSrc.Width;
end
else
begin
F_缩放比率:=F_长/BmpSrc.Height;
end;
end
else
if (F_长>) and (BmpSrc.Height>F_长) then
begin
F_缩放比率:=F_长/BmpSrc.Height;
end
else
if (F_宽>) and (BmpSrc.Width >F_宽) then
begin
F_缩放比率:=F_宽/BmpSrc.Width;
end
else
begin
F_缩放比率:=-;//如果没取到值,或原图已经小于设定值则不处理
end; if F_缩放比率> then
begin
BmpDest.Height:=Round(BmpSrc.Height*F_缩放比率);
BmpDest.Width:=Round(BmpSrc.Width *F_缩放比率); SetStretchBltMode(BmpDest.Canvas.Handle,HALFTONE);//设置指位图拉伸模式
stretchblt(BmpDest.Canvas.Handle,,,BmpDest.Width,BmpDest.Height,BmpSrc.Canvas.Handle,,,BmpSrc.Width,BmpSrc.Height,srccopy); //从源矩形中复制一个位图到目标矩形并适当压缩
F_处理状态:=true;
end;
end; if F_处理状态=true then
begin
//处理后,保存图片
JpgDest.CompressionQuality := ;
JpgDest.Assign(BmpDest);
JpgDest.SaveToFile(图片文件名);
end; JpgSrc.Free;
JpgDest.free;
BmpSrc.Free;
BmpDest.Free; end; procedure Rotate(Srcbmp, DestBmp: TBitmap; dbTheta: Double);//此过程是网上找的,不记得原博文地址了,抱歉
var
ptOrgCenter, ptTarCenter, ptc: TPoint;
pta: array[..] of TPoint;
ba: array[..] of integer;
i: integer;
function RotateXY(dbTheda: double; p1: TPoint): TPoint;
var
dbA: double;
_cosA, _sinA, _dbLastT: double;
begin
_dbLastT := -99999.999;
_cosA :=0.0;
_sinA :=0.0; if dbTheda <> _dbLastT then
begin
dbA := dbTheda * Pi / ;
_sinA := sin(dbA);
_cosA := cos(dbA);
_dbLastT := dbTheda;
end; Result.x := round(p1.x * _cosA + p1.y * _sinA);
Result.y := round(-p1.x * _sinA + p1.y * _cosA);
end;
begin
ptOrgCenter.x := Srcbmp.Width div ;
ptOrgCenter.y := Srcbmp.Height div ; pta[] := RotateXY(dbTheta,Point(, ));
//这里不知道原来为何减1
{pta[1]:=RotateXY(dbTheta,Point(Srcbmp.Width - 1, 0));
pta[2]:=RotateXY(dbTheta,Point(0, Srcbmp.Height - 1));
pta[3]:=RotateXY(dbTheta,Point(Srcbmp.Width - 1, Srcbmp.Height - 1));
}
pta[] := RotateXY(dbTheta,Point(Srcbmp.Width, ));
pta[] := RotateXY(dbTheta,Point(, Srcbmp.Height));
pta[] := RotateXY(dbTheta,Point(Srcbmp.Width, Srcbmp.Height)); DestBmp.PixelFormat := pf32bit;
DestBmp.Canvas.Brush.Color := clWindow; for i := to do
ba[i] := pta[i].x; DestBmp.width := MaxIntValue(ba) - MinIntValue(ba); for i := to do
ba[i] := pta[i].y; DestBmp.Height := MaxIntValue(ba) - MinIntValue(ba); ptc := RotateXY(dbTheta, Point(Srcbmp.Width div , Srcbmp.Height div )); ptTarCenter.x := DestBmp.Width div ;
ptTarCenter.y := DestBmp.Height div ; pta[].x := pta[].x + ptTarCenter.x - ptc.x;
pta[].y := pta[].y + ptTarCenter.y - ptc.y;
pta[].x := pta[].x + ptTarCenter.x - ptc.x;
pta[].y := pta[].y + ptTarCenter.y - ptc.y;
pta[].x := pta[].x + ptTarCenter.x - ptc.x;
pta[].y := pta[].y + ptTarCenter.y - ptc.y; if PlgBlt(DestBmp.Canvas.Handle, pta, Srcbmp.Canvas.Handle,
, , Srcbmp.Width - , Srcbmp.Height - , , , ) then
DestBmp.Canvas.Draw(, , DestBmp)
else
DestBmp.Canvas.TextOut(,,'只支持WinNT内核操作系统.');
end; //毫米单位转换为英寸单位
function MmToInch(Length: Extended): Extended;
begin
Result := Length/25.4;
end;
//英寸单位转换为毫米单位
function InchToMm(Length: Extended): Extended;
begin
Result := Length*25.4;
end;
end.
用中文参数变量,别笑,这样只是为了让大家更好的解读一些重点代码。
注意我这儿的图片质量,都用了高质量,如果觉得处理的大小太大,则可以降低质量来获得小一些的文件
注意:
1、参数值为0时,表示该项不处理。
2、处理为依次执行,即旋转、切边、缩放,后一项的参数,也应参考前一项,而非原图参数
3、缩放只支持等比缩放,也就是只会根据宽或高中的一个值进行缩放,根据哪一个值,则适用于大值等于设置值的处理原则。
4、切边是指对应的边去除设定值,缩放则为处理后的目标值不大于设定值。
delphi JPG图片 旋转 切边 缩放的更多相关文章
- 用Js+css3实现图片旋转,缩放,裁剪,滤镜
还是前端图片的老话题,花了半天时间,东拼西凑,凑出个demo,优点在于代码少,核心代码就6行,目前刚做了旋转,缩放,裁剪,滤镜要js做,网络上也有现成的代码, 但是想做到自定义的滤镜咋办呢?这还要从底 ...
- 自定义View实现图片的绘制、旋转、缩放
1.图片 把一张JPG图片改名为image.jpg,然后拷贝到项目的res-drawable中. 2.activity_main.xml <LinearLayout xmlns:android= ...
- Android图片旋转,缩放,位移,倾斜,对称完整示例(一)——imageView.setImageMatrix(matrix)和Matrix
MainActivity如下: import android.os.Bundle; import android.view.MotionEvent; import android.view.View; ...
- WPF图片预览之移动、旋转、缩放
原文:WPF图片预览之移动.旋转.缩放 RT,这个功能比较常见,但凡涉及到图片预览的都跑不了,在说自己的实现方式前,介绍一个好用的控件:Extended.Toolkit中的Zoombox,感兴趣的同学 ...
- Android图片旋转,缩放,位移,倾斜,对称完整演示样例(一)——imageView.setImageMatrix(matrix)和Matrix
MainActivity例如以下: import android.os.Bundle; import android.view.MotionEvent; import android.view.Vie ...
- Vue图片浏览组件v-viewer,支持旋转、缩放、翻转等操作
v-viewer 用于图片浏览的Vue组件,支持旋转.缩放.翻转等操作,基于viewer.js. 从0.x迁移 你需要做的唯一改动就是手动引入样式文件: 1 import 'viewerjs/dist ...
- Fresco 二三事:图片处理之旋转、缩放、裁剪切割图片
关于Fresco加载图片的处理,例如旋转.裁剪切割图片,在官方文档也都有提到,只是感觉写的不太详细,正好最近项目里有类似需求,所以分享一些使用小tip,后面的朋友就不用再走弯路浪费时间了.(测试图片分 ...
- 【CSS3动画】transform对文字及图片的旋转、缩放、倾斜和移动
前言:之前我有写过CSS3的transform这一这特性,对于它的用法,还不是很透彻,今天补充补充,呵呵 你懂的,小司机准备开车了. a)再提一提transform的四个属性 ①旋转--->ro ...
- Qt5:Qt中图片的翻转,旋转,缩放,扭曲操作
具体用到了 mirror() shear() scaled() translate() rotate() 等函数函数等会儿再写 (其中 translate() 和 rotate() 俩函数组合 ...
随机推荐
- BZOJ4554 - [TJOI2016&HEOI2016]游戏
原题链接 Description 给出一个的地图,地图上有空地.软石头和硬石头.求在这张地图上最多能放上多少个炸弹能使得任意两个炸弹之间不会互相炸到.炸弹能炸到的范围是该炸弹所在的一行和一列,炸弹的威 ...
- linux权限归属及特殊权限设置
访问权限:读取:允许查看内容 -read写入:允许修改内容 -write可执行:允许运行和切换 -excute(以上三点rwx共同决定最终权限)归属关系:所有者:拥有此文件/目录的用户 -user所属 ...
- Linux下安装MySQL数据库(压缩包方式安装)
1.这里我将Mysql安装在/usr/local/mysql目录里面,也可以安装在其他地方; mkdir /usr/local/mysql 2.下载MySQL压缩包 wget http://dev.M ...
- Linux以GB显示内存大小
Linux以GB显示内存大小 youhaidong@youhaidong-ThinkPad-Edge-E545:~$ free -g total used free shared buffers ca ...
- Intel_CS_WebRTC 验证性测试
机器: Centos 7.2 一.配置阿里云源 wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.163.com/.help/Cen ...
- R语言实现二分查找法
二分查找时间复杂度O(h)=O(log2n),具备非常高的效率,用R处理数据时有时候需要用到二分查找法以便快速定位 Rbisect <- function(lst, value){ low=1 ...
- iOS - XMPP Openfire 服务器的搭建
前言 提前下载好相关软件,且安装目录最好安装在全英文路径下.如果路径有中文名,那么可能会出现一些莫名其妙的问题. 提前准备好的软件: jdk-8u91-macosx-x64.dmg mysql-5.7 ...
- iOS - UIImageView 动画
1.UIImageView 动画 1.1 播放图片集 播放图片集 @property (nonatomic, strong) UIImageView *playImageView; self.play ...
- freemarker写select组件(二十二)
一,讲解一 1.宏定义 <#macro select id datas> <select id="${id}" name="${id}"> ...
- 书籍--嵌入式C语言
1,C语言嵌入式编程修炼 [C/C++]C语言嵌入式编程修炼·背景篇·软件架构篇·内存操作篇