想了解Delphi根据图片或者文字制作特殊的窗体的新动态吗?本文将为您提供详细的信息,我们还将为您解答关于delphi图片编辑的相关问题,此外,我们还将为您介绍关于.Delphi7升级到Delphi2
想了解Delphi 根据图片或者文字制作特殊的窗体的新动态吗?本文将为您提供详细的信息,我们还将为您解答关于delphi图片编辑的相关问题,此外,我们还将为您介绍关于.Delphi7升级到Delphi 2010、Delphi XE、Delphi XE2总结、ACTION中直接上传图片或者文档 .、ckfinder 直接上传图片或者文件 ,不用拉起 页面管理页面、delphi – 为Image创建一个特殊的视觉选择工具的新知识。
本文目录一览:- Delphi 根据图片或者文字制作特殊的窗体(delphi图片编辑)
- .Delphi7升级到Delphi 2010、Delphi XE、Delphi XE2总结
- ACTION中直接上传图片或者文档 .
- ckfinder 直接上传图片或者文件 ,不用拉起 页面管理页面
- delphi – 为Image创建一个特殊的视觉选择工具
Delphi 根据图片或者文字制作特殊的窗体(delphi图片编辑)
总结
以上是小编为你收集整理的Delphi 根据图片或者文字制作特殊的窗体全部内容。
如果觉得小编网站内容还不错,欢迎将小编网站推荐给好友。
.Delphi7升级到Delphi 2010、Delphi XE、Delphi XE2总结
总结
以上是小编为你收集整理的.Delphi7升级到Delphi 2010、Delphi XE、Delphi XE2总结全部内容。
如果觉得小编网站内容还不错,欢迎将小编网站推荐给好友。
ACTION中直接上传图片或者文档 .
1. 先在页面处配置上传按钮:
form中需要添加 enctype="multipart/form-data" 参数,如下
<html:form action="/menuSmart.shtml" enctype="multipart/form-data" method="post">
以下为上传按钮,并外加显示连接
- <td class="dvtCellLabel">菜单图片</td>
- <td class="dvtCellInfo">
- <html:file property="iconFile" />
- <html:hidden property="icon"/>
- <logic:notEmpty name="menuSmartForm" property="icon">
- <a href="${menuSmartForm.icon}" target="_blank">查看</a>
- </logic:notEmpty>
- d>
2. 以下为ACTION中的上传文件操作代码:
- /**
- * 文件上传
- * @param form
- * @param request
- * @param isUpdate
- * @return
- * @throws Exception
- */
- protected String simpleUpload(ActionForm form, HttpServletRequest request, boolean isUpdate) throws Exception {
- MenuForm menuForm = (MenuForm) form;
- String result="" ;
- FormFile file = null;
- FormFile[] files = new FormFile[]{menuForm.getIconFile(),menuForm.getBgImgFile()};
- for (int i = 0; i < files.length; i++) {
- file = files[i];
- if (file != null && !file.getFileName().equals("")) {
- String endName = FileUtil.getFileExt(file.getFileName());
- if(!(endName.toUpperCase().equals("PNG")||endName.toUpperCase().equals("JPG")||endName.toUpperCase().equals("GIF"))){
- log.info("上传的图标文件不是图片格式");
- return null;
- }
- /*上至上传相对路径*/
- String uploadPath = ("upload" + File.separator );
- /*设置本地绝对路径*/
- String uploadDir = servlet.getServletContext().getRealPath(uploadPath);
- try {
- /*创建文件流信息*/
- File nwFile = new File(uploadDir);
- /*判断是否存在改目录文件夹*/
- if (!nwFile.exists())
- nwFile.mkdirs();
- long uid = System.currentTimeMillis();
- /*获取文件后缀名*/
- String fileExt = "." + endName;
- String fname = uploadDir + File.separator + uid + fileExt;
- InputStream streamIn = file.getInputStream();
- OutputStream streamOut = new FileOutputStream(fname);
- int bytesRead = 0;
- byte[] buffer = new byte[8192];
- /*开始写文件*/
- while ((bytesRead = streamIn.read(buffer, 0, 8192)) != -1) {
- streamOut.write(buffer, 0, bytesRead);
- }
- streamOut.close();
- streamIn.close();
- file.destroy();
- String realName = "upload" + "/"+ uid + fileExt;
- /*将真实的文件名设置到FORM中*/
- if(i==0){
- menuForm.setIcon(realName);
- }
- if(i==1){
- menuForm.setBgImg(realName);
- }
- result = "upload" + File.separator + uid + fileExt;
- } catch (Exception e) {
- log.error("上传图片信息是发生异常:"+e);
- return null;
- }
- }
- }
- return result;
- }
3. 如果还需要对文档进行解压缩操作,以及其他的操作,请参考 本博客中标题为 “AJAX上传下载文件”的文章。
ckfinder 直接上传图片或者文件 ,不用拉起 页面管理页面
OSC 请你来轰趴啦!1028 苏州源创会,一起寻宝 AI 时代
想要个这样的
,不想要
delphi – 为Image创建一个特殊的视觉选择工具
我发现了两种实现方法:
>实现显示黑暗图像的控件.
当用户在此控件上拖动椭圆时,椭圆会将实际图像(未加深的图像)复制到控件画布中.
在这种情况下,当他/她尝试将椭圆的大小调整为较小的尺寸时,首先整个椭圆的矩形区域变暗,然后在新的较小椭圆中绘制真实的图像.
>与方法1相同,但我们不是在控件的画布上绘图,而是创建一个显示真实图像的新控件.在这种情况下,发送到新控件的所有消息都应该传递给父控件.因为如果用户尝试将椭圆的大小调整为较小的大小,则WM_MOVE消息将发送到此控件,而不是父控件.
可以,有人告诉我实现这个的正确方向.我认为方法1很难实现,因为它会引起很多闪烁.除非我实现了一种只通过InvalidateRect函数重绘已更改部分的方法.
这是我实现的TScreenEmul类的代码,直到现在.它有效,但它有闪烁.
unit ScreenEmul; interface uses Classes,Types,Windows,Messages,Graphics,Controls,SysUtils,Dialogs,ExtCtrls; const PixelCountMax = 32768; type PRGBTripleArray = ^TRGBTripleArray; TRGBTripleArray = array[0..PixelCountMax-1] of TRGBTriple; TScreenEmul = class(TCustomControl) private LastRect,DrawRect: TRect; DrawStart: TPoint; MouseDown: Boolean; Backup,Darken: TBitmap; FBitmap: TBitmap; procedure BitmapChange(Sender: TObject); procedure WMLButtonDown(var Message: TWMLButtonDown); message WM_LBUTTONDOWN; procedure WMMouseMove(var Message: TWMMouseMove); message WM_MOUSEMOVE; procedure WMLButtonUp(var Message: TWMLButtonUp); message WM_LBUTTONUP; procedure WMEraseBkgnd(var Message: TWMEraseBkgnd ); message WM_ERASEBKGND; procedure WMPaint(var Message: TWMPaint); message WM_PAINT; procedure DarkenBitmap(B: TBitmap); procedure RestoreImage; procedure CalculateDrawRect(X,Y: Integer); procedure SetBitmap(const Value: TBitmap); public constructor Create(AOwner: TComponent); override; destructor Destroy; override; property Bitmap: TBitmap read FBitmap write SetBitmap; end; implementation { TScreenEmul } function AlphaBlend(Color1,Color2: TRGBTriple; Alpha: Byte): TRGBTriple; overload; var rPrimary : Real; // Primary (Color1) Intensity rSecondary: Real;// Secondary (Color2) Intensity begin rPrimary:=((Alpha+1)/$100); rSecondary:=(($100-Alpha)/$100); with Result do begin rgbtBlue := Trunc(Color1.rgbtBlue * rPrimary + Color2.rgbtBlue * rSecondary); rgbtGreen := Trunc(Color1.rgbtGreen * rPrimary + Color2.rgbtGreen * rSecondary); rgbtRed := Trunc(Color1.rgbtRed * rPrimary + Color2.rgbtRed * rSecondary); end; end; procedure TScreenEmul.BitmapChange(Sender: TObject); begin FreeAndNil(Backup); Backup := TBitmap.Create; Backup.Assign(FBitmap); DarkenBitmap(FBitmap); Darken := TBitmap.Create; Darken.Assign(FBitmap); end; procedure TScreenEmul.CalculateDrawRect(X,Y: Integer); begin if X >= DrawStart.X then begin if DrawRect.Left <> DrawStart.X then DrawRect.Left := DrawStart.X; DrawRect.Right := X end else begin if DrawRect.Right <> DrawStart.X then DrawRect.Right := DrawStart.X; DrawRect.Left := X; end; if Y >= DrawStart.Y then begin if DrawRect.Top <> DrawStart.Y then DrawRect.Top := DrawStart.Y; DrawRect.Bottom := Y; end else begin if DrawRect.Bottom <> DrawStart.Y then DrawRect.Bottom := DrawStart.Y; DrawRect.Top := Y; end; end; constructor TScreenEmul.Create(AOwner: TComponent); begin inherited; MouseDown := False; FBitmap := TBitmap.Create; FBitmap.OnChange := BitmapChange; DoubleBuffered := True; end; procedure TScreenEmul.DarkenBitmap(B: TBitmap); var I,J: Integer; Row: PRGBTripleArray; rgbBlack: tagRGBTRIPLE; begin rgbBlack.rgbtBlue := 0; rgbBlack.rgbtGreen := 0; rgbBlack.rgbtRed := 0; for I := 0 to B.Height - 1 do begin Row := B.ScanLine[I]; for J := 0 to B.Width - 1 do Row[J] := AlphaBlend(Row[J],rgbBlack,150); end; end; destructor TScreenEmul.Destroy; begin FBitmap.Free; inherited; end; procedure TScreenEmul.RestoreImage; begin BitBlt(FBitmap.Canvas.Handle,LastRect.Left,LastRect.Top,RectWidth(LastRect),RectHeight(LastRect),Darken.Canvas.Handle,SRCcopY); end; procedure TScreenEmul.SetBitmap(const Value: TBitmap); begin FBitmap := Value; FBitmap.OnChange := BitmapChange; end; procedure TScreenEmul.WMEraseBkgnd(var Message: TWMEraseBkgnd); begin Message.Result := LResult(False); end; procedure TScreenEmul.WMLButtonDown(var Message: TWMLButtonDown); begin MouseDown := True; with DrawRect do begin Left := Message.XPos; Top := Message.YPos; Right := Left; Bottom := Top; end; DrawStart.X := DrawRect.Top; DrawStart.Y := DrawRect.Left; end; procedure TScreenEmul.WMLButtonUp(var Message: TWMLButtonUp); begin MouseDown := False; RestoreImage; InvalidateRect(Self.Handle,DrawRect,False); end; procedure TScreenEmul.WMMouseMove(var Message: TWMMouseMove); begin if not MouseDown then Exit; CalculateDrawRect(Message.XPos,Message.YPos); RestoreImage; BitBlt( FBitmap.Canvas.Handle,DrawRect.Left,DrawRect.Top,RectWidth(DrawRect),RectHeight(DrawRect),Backup.Canvas.Handle,SRCcopY); InvalidateRect(Self.Handle,False); LastRect := DrawRect; end; procedure TScreenEmul.WMPaint(var Message: TWMPaint); var B: TBitmap; Rct: TRect; X,Y: Integer; FullRepaint: Boolean; begin inherited; FullRepaint := GetUpdateRect(Self.Handle,Rct,False); if not FullRepaint then begin Canvas.Draw(0,FBitmap); end else begin B := TBitmap.Create; B.SetSize(RectWidth(Rct),RectHeight(Rct)); FBitmap.Canvas.copyRect(Rect(0,B.Width,B.Height),B.Canvas,Rct); Canvas.Draw(0,B); FreeAndNil(B); end; end; end.
使用此类:
var ScreenEmul: TScreenEmul; begin ScreenEmul := TScreenEmul.Create(Self); ScreenEmul.Parent := Self; ScreenEmul.Align := alClient; ScreenEmul.Bitmap.LoadFromFile('C:\img13.bmp');
解决方法
1- WMEraseBkgnd应返回True以防止绘制背景.我错误地归还了假.
2-我继承了WMPaint方法,这是不正确的.我还将更新的Rect复制到新的Bitmap中,然后将位图绘制到画布中,这对绘制过程来说很慢.这是完整的固定源代码:
unit ScreenEmul; interface uses Classes,Darken: TBitmap; FBitmap: TBitmap; procedure BitmapChange(Sender: TObject); procedure WMLButtonDown(var Message: TWMLButtonDown); message WM_LBUTTONDOWN; procedure WMMouseMove(var Message: TWMMouseMove); message WM_MOUSEMOVE; procedure WMLButtonUp(var Message: TWMLButtonUp); message WM_LBUTTONUP; procedure WMEraseBkgnd(var Message: TWMEraseBkgnd); message WM_ERASEBKGND; procedure WMPaint(var Message: TWMPaint); message WM_PAINT; procedure DarkenBitmap(B: TBitmap); procedure RestoreImage; procedure CalculateDrawRect(X,SRCcopY); end; procedure TScreenEmul.SetBitmap(const Value: TBitmap); begin FBitmap := Value; FBitmap.OnChange := BitmapChange; end; procedure TScreenEmul.WMEraseBkgnd(var Message: TWMEraseBkgnd); begin Message.Result := LResult(True); end; procedure TScreenEmul.WMLButtonDown(var Message: TWMLButtonDown); begin MouseDown := True; with DrawRect do begin Left := Message.XPos; Top := Message.YPos; Right := Left; Bottom := Top; end; DrawStart.X := DrawRect.Top; DrawStart.Y := DrawRect.Left; end; procedure TScreenEmul.WMLButtonUp(var Message: TWMLButtonUp); begin MouseDown := False; RestoreImage; InvalidateRect(Self.Handle,False); LastRect := DrawRect; end; procedure TScreenEmul.WMPaint(var Message: TWMPaint); var Rct: TRect; FullRepaint: Boolean; begin FullRepaint := GetUpdateRect(Self.Handle,False); if not FullRepaint then Canvas.Draw(0,FBitmap) else BitBlt(Canvas.Handle,Rct.Left,Rct.Top,RectWidth(Rct),RectHeight(Rct),FBitmap.Canvas.Handle,SRCcopY); end; end.
我们今天的关于Delphi 根据图片或者文字制作特殊的窗体和delphi图片编辑的分享已经告一段落,感谢您的关注,如果您想了解更多关于.Delphi7升级到Delphi 2010、Delphi XE、Delphi XE2总结、ACTION中直接上传图片或者文档 .、ckfinder 直接上传图片或者文件 ,不用拉起 页面管理页面、delphi – 为Image创建一个特殊的视觉选择工具的相关信息,请在本站查询。
本文标签: