private Task <Bitmap> GetBitmapAsync(string filePath, int size) { var resizedFilePath = GetResizedPath(filePath, size); // return cached version if (_cache.TryGetValue(resizedFilePath, out var item)) { var bitmap = (Bitmap)item; return(Task.FromResult(bitmap)); } // return resized version from disk if (File.Exists(resizedFilePath)) { lock (_locker) { if (File.Exists(resizedFilePath)) { var bitmap = new Bitmap(resizedFilePath); _cache.Set(resizedFilePath, bitmap, new MemoryCacheEntryOptions { Size = 1 }); return(Task.FromResult(bitmap)); } } } // resize and return image if (File.Exists(filePath)) { return(Task.Run(() => { lock (_locker) { if (File.Exists(filePath) && !File.Exists(resizedFilePath)) { if (_platform is WindowsPlatform) { ResizeWithSystemDrawing(filePath, resizedFilePath, size); } else { ResizeWithImageSharp(filePath, resizedFilePath, size); } } if (File.Exists(resizedFilePath)) { var bitmap = new Bitmap(resizedFilePath); _cache.Set(resizedFilePath, bitmap, new MemoryCacheEntryOptions { Size = 1 }); return bitmap; } return null; } })); } return(Task.FromResult <Bitmap>(null)); }
private IObservable <IBitmap> LoadBitmap(TdApi.File file, long id, AvatarSize size) { var filename = GetFilename(file, id, size); if (file != null) { return(_fileLoader.LoadFile(file, LoadPriority.Max) .FirstAsync(f => f.Local != null && f.Local.IsDownloadingCompleted) .SelectMany(f => PrepareAvatar(f.Local.Path, (int)size, filename).ToObservable()) .SelectMany(path => CreateBitmap(path).ToObservable()) .Do(bitmap => { _cache.Set(filename, bitmap, new MemoryCacheEntryOptions { Size = 1 }); })); } return(Observable.Return <Bitmap>(null)); }
private Bitmap GetBitmap(string filePath) { lock (_locker) { Bitmap bitmap = null; if (_cache.TryGetValue(filePath, out var item)) { bitmap = (Bitmap)item; } else if (File.Exists(filePath)) { bitmap = new Bitmap(filePath); _cache.Set(filePath, bitmap, new MemoryCacheEntryOptions { Size = 1 }); } return(bitmap); } }