我有一个存储和处理图像的WCF服务。使用应用程序可以通过调用Bitmap Download(int fileid)
来下载图像,也可以通过调用Bitmap Crop(Bitmap image, x1, x2, y1, y2)
,Bitmap Resize(Bitmap image, int height)
和Bitmap Rotate(Bitmap image, float angle)
等其他方法来修改它们。
这里的问题是,当客户想要调用上面三种图像处理方法中的任何一种(裁剪,调整大小,旋转)时,他们必须首先下载它,然后连续调用操作方法,每次将图像发送回WCF服务,然后获取新的System.Drawing.Bitmap
对象作为返回参数。
问题是,如何避免来回发送图像?有没有办法可以通过一种方法调用可变数量的方法?如果我还不够清楚,那么这就是我想做的事情(我知道这不是有效的代码):
Bitmap bmp = Download(2, Resize(500, 200), Rotate(90.00));
答案 0 :(得分:3)
我过去设计了一个类似的API,它接受了一个“动作”列表作为它的参数。类似的东西:
List<Action> actions = new List<Action>();
a1 = new Action();
a1.action = Action.ActionType.Resize;
a1.params.add(500);
a1.params.add;
actions.add(a1);
a2 = new Action();
a2.action = Action.ActionTypes.Rotate;
a2.params.add(90);
actions.add(a2);
Bitmap bmp = Download(actions);
答案 1 :(得分:2)
我可能会这样做:
public Bitmap Download(int image, Dictionary<string, string[]> operations)
{
// fetch image here
ForEach(KeyValuePair<string, string[]> kvp in operations)
{
switch(kvp.Key)
{
case "Crop":
...etc...etc
}
}
}
字典键可以是方法名称,值可以是传递给方法所需的任何参数。
答案 2 :(得分:0)
说实话,这对于WCF服务来说有点奇怪。那里的大多数客户都足够聪明,可以自己操作图像,而且不需要服务器就可以完成。
您可以让客户端将映像上载到服务器并让WCF服务返回唯一ID。然后,所有后续调用都将发送唯一ID而不是完整位图,告诉服务器对刚刚上传的图像执行操作。操作完图像后,再次调用下载,客户端将重新下载修改后的图像。
如果您想要防止这些图像长期存储在服务器上,您的服务器需要暂时缓存这些图像并最终在一定时间后删除它们。
答案 3 :(得分:0)
这是另一种解决方法。该方法可以接受一个对象数组,每个对象都包含特定于它所代表的图像操作类型的DataMembers。
public void Download(int fileid, params object[] operations);
在客户端,我们这样调用它......
Bitmap edit = Download(1, new CropOperation(1, 2, 3, 4), new RotateOperation(57));
CropOperation
和RotateOperation
都是简单的DataContract
类。
在服务器端,我们对GetType()
中的每个对象执行object[] operations
,之后我们就可以访问对象的成员并调用相应的方法。