GVKun编程网logo

Delphi 根据图片或者文字制作特殊的窗体(delphi图片编辑)

7

想了解Delphi根据图片或者文字制作特殊的窗体的新动态吗?本文将为您提供详细的信息,我们还将为您解答关于delphi图片编辑的相关问题,此外,我们还将为您介绍关于.Delphi7升级到Delphi2

想了解Delphi 根据图片或者文字制作特殊的窗体的新动态吗?本文将为您提供详细的信息,我们还将为您解答关于delphi图片编辑的相关问题,此外,我们还将为您介绍关于.Delphi7升级到Delphi 2010、Delphi XE、Delphi XE2总结、ACTION中直接上传图片或者文档 .、ckfinder 直接上传图片或者文件 ,不用拉起 页面管理页面、delphi – 为Image创建一个特殊的视觉选择工具的新知识。

本文目录一览:

Delphi 根据图片或者文字制作特殊的窗体(delphi图片编辑)

Delphi 根据图片或者文字制作特殊的窗体(delphi图片编辑)

总结

以上是小编为你收集整理的Delphi 根据图片或者文字制作特殊的窗体全部内容。

如果觉得小编网站内容还不错,欢迎将小编网站推荐给好友。

.Delphi7升级到Delphi 2010、Delphi XE、Delphi XE2总结

.Delphi7升级到Delphi 2010、Delphi XE、Delphi XE2总结

总结

以上是小编为你收集整理的.Delphi7升级到Delphi 2010、Delphi XE、Delphi XE2总结全部内容。

如果觉得小编网站内容还不错,欢迎将小编网站推荐给好友。

ACTION中直接上传图片或者文档 .

ACTION中直接上传图片或者文档 .

1.  先在页面处配置上传按钮:

             form中需要添加 enctype="multipart/form-data" 参数,如下

             <html:form action="/menuSmart.shtml"  enctype="multipart/form-data" method="post">   

             以下为上传按钮,并外加显示连接

              

[java] view plain copy print ?
  1. <td class="dvtCellLabel">菜单图片</td>  
  2. <td class="dvtCellInfo">  
  3.     <html:file property="iconFile" />  
  4.     <html:hidden property="icon"/>  
  5.     <logic:notEmpty name="menuSmartForm" property="icon">  
  6.         <a href="${menuSmartForm.icon}" target="_blank">查看</a>  
  7.     </logic:notEmpty>  
  8. d>  
<td>菜单图片</td> <td> <html:file property="iconFile" /> <html:hidden property="icon"/> <logic:notEmpty name="menuSmartForm" property="icon"> <a href="${menuSmartForm.icon}" target="_blank">查看</a> </logic:notEmpty> </td>

2.  以下为ACTION中的上传文件操作代码:

           

[java] view plain copy print ?
  1. /** 
  2.  * 文件上传 
  3.  * @param form 
  4.  * @param request 
  5.  * @param isUpdate 
  6.  * @return  
  7.  * @throws Exception 
  8.  */  
  9. protected String simpleUpload(ActionForm form, HttpServletRequest request, boolean isUpdate) throws Exception {  
  10.     MenuForm menuForm = (MenuForm) form;  
  11.     String result="" ;  
  12.     FormFile file = null;  
  13.     FormFile[] files = new FormFile[]{menuForm.getIconFile(),menuForm.getBgImgFile()};  
  14.     for (int i = 0; i < files.length; i++) {  
  15.         file = files[i];  
  16.         if (file != null && !file.getFileName().equals("")) {  
  17.             String endName =  FileUtil.getFileExt(file.getFileName());  
  18.             if(!(endName.toUpperCase().equals("PNG")||endName.toUpperCase().equals("JPG")||endName.toUpperCase().equals("GIF"))){  
  19.                 log.info("上传的图标文件不是图片格式");  
  20.                 return null;  
  21.             }  
  22.             /*上至上传相对路径*/  
  23.             String uploadPath = ("upload" + File.separator );  
  24.             /*设置本地绝对路径*/  
  25.             String uploadDir = servlet.getServletContext().getRealPath(uploadPath);  
  26.             try {  
  27.                 /*创建文件流信息*/  
  28.                 File nwFile = new File(uploadDir);  
  29.                 /*判断是否存在改目录文件夹*/  
  30.                 if (!nwFile.exists())   
  31.                     nwFile.mkdirs();  
  32.                 long uid = System.currentTimeMillis();  
  33.                 /*获取文件后缀名*/  
  34.                 String fileExt = "." + endName;  
  35.                 String fname = uploadDir + File.separator + uid + fileExt;  
  36.                 InputStream streamIn = file.getInputStream();  
  37.                 OutputStream streamOut = new FileOutputStream(fname);  
  38.                 int bytesRead = 0;  
  39.                 byte[] buffer = new byte[8192];  
  40.                 /*开始写文件*/  
  41.                 while ((bytesRead = streamIn.read(buffer, 08192)) != -1) {  
  42.                     streamOut.write(buffer, 0, bytesRead);  
  43.                 }  
  44.                 streamOut.close();  
  45.                 streamIn.close();  
  46.                 file.destroy();  
  47.                 String realName = "upload" + "/"+ uid + fileExt;  
  48.                 /*将真实的文件名设置到FORM中*/  
  49.                 if(i==0){  
  50.                     menuForm.setIcon(realName);  
  51.                 }  
  52.                 if(i==1){  
  53.                     menuForm.setBgImg(realName);  
  54.                 }  
  55.                 result = "upload" + File.separator + uid + fileExt;  
  56.             } catch (Exception e) {  
  57.                 log.error("上传图片信息是发生异常:"+e);  
  58.                 return null;  
  59.             }  
  60.         }  
  61.     }  
  62.     return result;  
  63. }  
/** * 文件上传 * @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 直接上传图片或者文件 ,不用拉起 页面管理页面

ckfinder 直接上传图片或者文件 ,不用拉起 页面管理页面

OSC 请你来轰趴啦!1028 苏州源创会,一起寻宝 AI 时代

   想要个这样的         

        ,不想要

delphi – 为Image创建一个特殊的视觉选择工具

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创建一个特殊的视觉选择工具的相关信息,请在本站查询。

本文标签: