2011-09-03 102 views
0

我有一个存储和处理图像的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

这是另一种解决这个问题的方法。该方法可以接受一个对象数组,每个对象都包含特定于它所表示的图像操作类型的DataMembers。

public void Download(int fileid, params object[] operations); 

在客户端,我们调用它是这样的...

Bitmap edit = Download(1, new CropOperation(1, 2, 3, 4), new RotateOperation(57)); 

CropOperationRotateOperation都是简单DataContract类。

在服务器端,我们对object[] operations中的每个对象执行GetType(),之后我们可以访问对象的成员并调用适当的方法。

0

说实话,这是一个WCF服务有点奇怪功能。大多数客户都足够聪明地自己操作图像,并且不需要服务器来完成它。

你可以让客户端的图像上传到服务器,并有WCF服务返回一个唯一的ID。然后,所有连续呼叫都会发送唯一ID而不是完整的位图,从而告诉服务器对刚上传的图像执行操作。当您完成对图像的操作后,再次致电下载,客户端将重新下载修改后的图像。

您的服务器需要临时缓存这些图像,并最终在一定的时间跨度后删除它们,如果你想防止这些图片来自实际上是被存储在服务器长期的。

+0

问题中的WCF服务实际上是一个图像存储库。操作存储的图像只是辅助功能。我想要做的是让客户端从服务中下载操作图像,而不用修改存储在服务上的原始图像。 – rafale

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); 
+0

+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 
     } 
    } 
} 

词典按键可能是一个方法名和值可能是你需要的任何参数传递给方法。

相关问题