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 应用程序。这样做有问题吗?认为它甚至可能使我们的一些列表视图加载速度更快,因为它们没有抓取图像并一遍又一遍地处理它们的颜色。

4

2 回答 2

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;
    }
}
于 2016-08-04T19:17:14.380 回答
0

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

如果您正在构建一个服务器模块,那么视角会有所不同,但是只要一个用户选择颜色,而您唯一应该做的就是绘制它,那么用图像初始化数组有什么意义呢?

它只会让您记忆犹新,因为用户可能会选择这种颜色..

于 2016-08-04T15:44:22.333 回答