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() 俩函数组合 ...
随机推荐
- CodeForces - 730A 贪心+模拟
贪心策略: 1.只有一个最大值,选着第二大的一起参加比赛减分. 2.有奇数个最大值,选择三个进行比赛. 3.偶数个最大值,选择两个进行比赛. 为什么不把最大值全部选择? 因为最多只能选五个,有可能选择 ...
- SpringCloud @FeignClient的类注解@ReqestMapping无效报错:No message available","path":"/xxxx
最近在使用Feign组合微服务的时候发现在@FeignClient接口类上使用@ReqestMapping无效. 像下面的这个代码: @FeignClient("xxx") @Re ...
- java程序中执行HiveQL
这里是指java中执行hive或者hiveQL. 注意:而不是经常说的通过JDBC的方式连接Hiveserver2来执行查询.是在部署了hiveserver的服务器上执行hive命令.这样就可以将分析 ...
- HighCharts之2D饼图
HighCharts之2D饼图 1. HighCharts之2D饼图源码 <!DOCTYPE html> <html> <head> <meta charse ...
- Oracle连接出错(一)
1.错误描述 java.sql.SQLException: ORA-0064:error occurred at recursive SQL level 1. ORA-06153:unable to ...
- 利用Java API生成50到100之间的随机数
利用Java API生成50到100之间的随机数 /** * */ package com.you.demo; import java.util.Random; /** * @author Admin ...
- 芝麻HTTP:批量部署Splash负载集群
安装Ansible: 看官方文档去:http://www.ansible.com.cn/index.html 好像这个主控端不支持Windows? 大家虚拟机装个Ubuntu吧. 闲话少扯直接上干货: ...
- angular路由参数说明
AngularJS 路由 本章节我们将为大家介绍 AngularJS 路由. AngularJS 路由允许我们通过不同的 URL 访问不同的内容. 通过 AngularJS 可以实现多视图的单页Web ...
- order调用mdp
Java代码 else { crmMessageService[A1] .applyAsync(crmMdpRequest); } public v ...
- GAN 转
生成式对抗网络(GAN)是近年来大热的深度学习模型.最近正好有空看了这方面的一些论文,跑了一个GAN的代码,于是写了这篇文章来介绍一下GAN. 本文主要分为三个部分: 介绍原始的GAN的原理 同样非常 ...