Изображение из байта в оптимизированную презентацию веб-страницы
Я получаю данные сохраненного изображения в базе данных в виде массива byte[]; затем я конвертирую его в System.Drawing.Image, как показано ниже;
public System.Drawing.Image CreateImage(byte[] bytes)
{
System.IO.MemoryStream memoryStream = new System.IO.MemoryStream(bytes);
System.Drawing.Image image = System.Drawing.Image.FromStream(memoryStream);
return image;
}
(*) С другой стороны, я планирую показать список изображений на страницах asp.net, когда клиент прокручивает страницу вниз. Чем больше пользователь опускается на страницу, которую он / она видит, тем больше фотографий. Так что это означает быструю загрузку страниц и богатый пользовательский опыт. (вы можете увидеть, что я имею в виду на www.mashable.com, просто позаботьтесь о новых загрузках фотографий, когда будете прокручивать страницу вниз.)
Кроме того, возвращенный объект imgae из метода выше, как я могу показать его в цикле динамически, используя условия (*) выше.
С уважением BK
1 ответ
Ну, я думаю, что главным узким местом является попадание в базу данных каждый раз, когда вам нужно изображение. (Особенно учитывая, что многие пользователи заходят на сайт.)
Я бы пошел со следующим решением:
- База данных будет хранить изображения с оригинальным качеством;
- Обработчик.ashx будет кэшировать изображения в файловой системе в различных необходимых разрешениях (например, 32x32 пикселя для значков, 48x48 для миниатюр и т. д.), возвращая их по запросу и получая доступ к базе данных только один раз; (в этом примере показано, как вернуть изображение с помощью обработчика ashx)
- Фактические страницы будут указывать на страницу.ashx, чтобы получить изображение. (лайк
<img scr="GetImage.ashx?ID=324453&Size=48" />
)
ОБНОВИТЬ:
Таким образом, фактический рабочий процесс в обработчике будет выглядеть так:
public void ProcessRequest (HttpContext context)
{
// Create path of cached file based on the context passed
int size = Int32.Parse(context.Request["Size"]);
// For ID Guids are possibly better
// but it can be anything, even parameter you need to pass
// to the web service in order to get those bytes
int id = Int32.Parse(context.Request["Id"]);
string imagePath = String.Format(@"images/cache/{0}/{1}.png", size, id);
// Check whether cache image exists and created less than an hour ago
// (create it if necessary)
if (!File.Exists(imagePath)
|| File.GetLastWriteTime(imagePath) < DateTime.Now.AddHours(-1))
{
// Get the file from the web service here
byte[] imageBytes = ...
// Save as a file
using (var memoryStream = new MemoryStream(imageBytes))
using (var outputStream = File.OpenWrite(imagePath))
Image.FromStream(memoryStream).Save(outputStream);
}
context.Response.ContentType = "image/png";
context.Response.WriteFile(imagePath);
}