2016-08-04 54 views
0

我有一个公共静态方法,返回一个颜色替换图像(我通过一个黑色的图像,并返回相同的图像与红色,而不是黑色,或我选择的任何颜色)。我应该使用公共静态字段来显示图像和颜色吗?

它看起来像这样:

public class ColorImage 
{ 
    public static UIImage GetColoredImage(UIImage image, UIColor color) 
    { 
     UIImage coloredImage = null; 
     if (color == null) 
     { 
      color = UIColor.FromRGB(44, 132, 248); 
     } 

     UIGraphics.BeginImageContextWithOptions(image.Size, false, UIScreen.MainScreen.Scale); 
     using (CGContext context = UIGraphics.GetCurrentContext()) 
     { 
      context.TranslateCTM(0, image.Size.Height); 
      context.ScaleCTM(1.0f, -1.0f); 

      var rect = new RectangleF(0, 0, (float)image.Size.Width, (float)image.Size.Height); 

      context.ClipToMask(rect, image.CGImage); 
      context.SetFillColor(color.CGColor); 
      context.FillRect(rect); 

      coloredImage = UIGraphics.GetImageFromCurrentImageContext(); 
      UIGraphics.EndImageContext(); 
     } 
     return coloredImage; 
    } 
} 

我跟同事说话,我们认为这可能是更好的存储图像(颜色和没有颜色)和颜色,我们计划在公共使用我们整个应用程序静态字段。这样,如果我需要使用这些颜色或图像之一,我可以拨打:

Textfield.BackgroundColor = ColorCache.MainColor; 
Textfield.Image = ImageCache.UserImage; 

或者沿着这些线。这是使用Xamarin的iOS应用程序。这样做有问题吗?认为它甚至可能会让我们的一些列表视图加载得更快,因为它们不是抓取图像,而是一遍又一遍地处理它们的颜色。

回答

0

我认为将不必要的数据加载到内存没有任何意义。 你打算做的是为你可能想到的每种颜色创建一个图像,如果用户将选择该特定颜色,它将准备好使用。

如果你正在构建一个服务器模块,它有点不同的观点,但只要一个用户选择颜色,并且你应该做的唯一事情就是绘制它,那么使用图像初始化一个数组有什么意义?

它只会爆你的内存,用户可以选择这种颜色的机会..

+0

的图像被用于遍及应用,如在同一图像多次,甚至在同一屏幕上。现在它一次又一次地为图像着色,在列表视图的情况下。我不知道ios是通过使用相同的图像来优化它,还是每次从磁盘抓取图像...我宁愿牺牲图像的少量内存,以获得性能提升 – aufty

+1

,如果这是情况下,在我看来更好的方法是: 创建一个单身人士,每次只有一个图像处理将可用,一旦图像准备好将它保存在Dictionary 中,下次单击将被解雇将会寻找那个图像,如果它存在的话就采取它 - 否则,生成一个新图像。 这样,你将永远只拥有“按需”使用的数据,而不仅仅是像轮盘一样创建各种图像。 – Tomerz

1

而是在静态加载一次一切都像的,这将是一个更好的方法是使用缓存。因此,一次加载的图像将被保存在内存中,并且在下次请求时不会创建。但是一个尚未被问到的图像将不会占用任何内存。

您可以使用普通属性或静态属性。

或者创建一个私有只读字典,颜色名称和图像作为键和值。如果密钥在请求返回时可用,则它会创建并添加到字典并返回图像。

一些示例代码:

public static class ColorImage 
{ 
    private static readonly Dictionary<UIColor, UIImage> _colorDictionary = new Dictionary<UIColor, UIImage>(); 

    public static UIImage GetColoredImage(UIImage image, UIColor color) 
    { 
     if(_colorDictionary.ContainsKey(color)) 
     { 
      _colorDictionary.TryGetValue(color, out image); 
     } 
     else 
     { 
      //create the image 
      _colorDictionary.Add(color, image); 
     } 
     return image; 
    } 
} 
相关问题