Как изменить размеры изображения в C# к определенному размеру жесткого диска?

Я нашел ответ. Я могу использовать .AsQueryable<>() дополнительный метод для преобразования моего списка в IQueryable, затем выполнить динамический порядок против него.

10
задан pupeno 11 August 2009 в 05:57
поделиться

3 ответа

Это зависит от того, что вы хотите изменить.

  1. Уменьшить размер изображения
  2. Изменить формат изображения
  3. Если формат поддерживает сжатие с потерями, уменьшите качество
  4. Если вы храните метаданные, которые вам не нужны, удалите их
  5. Уменьшите количество цветов (и бит на пиксель)
  6. Перейдите в формат палитры
  7. Смените на палитру форматирование и уменьшение цветов

Трудно предположить, каков будет окончательный размер диска, но если вы знаете начальную точку, вы можете получить довольно хорошую оценку. Уменьшение размера, вероятно, будет пропорциональным, уменьшение количества бит на пиксель также, вероятно, будет пропорциональным.

Если вы меняете формат, сжатие или качество, это на самом деле только предположение - сильно зависит от содержимого изображения.

0
ответ дан 3 December 2019 в 22:38
поделиться

Если это 24-битный BMP, я думаю, вам нужно сделать что-то вроде этого:

//initial size =  WxH
long bitsperpixel = 24; //for 24 bit BMP
double ratio;
long size = 2 * 1 << 20;//2MB = 2 * 2^20
size -= 0x35;//subtract the BMP header size from it
long newH, newW, left, right, middle,BMProwsize;
left = 1;
right = size;//binary search for new width and height
while (left < right)
{
    middle = (left + right + 1) / 2;
    newW = middle;
    ratio = Convert.ToDouble(newW) / Convert.ToDouble(W);
    newH = Convert.ToInt64(ratio * Convert.ToDouble(H));
    BMProwsize = 4 * ((newW * bitsperpixel + 31) / 32);
    //row size must be multiple of 4
    if (BMProwsize * newH <= size)
        left = middle;
    else
        right = middle-1;                
}

newW = left;
ratio = Convert.ToDouble(newW) / Convert.ToDouble(W);
newH = Convert.ToInt64(ratio * Convert.ToDouble(H));
//resize image to newW x newH and it should fit in <= 2 MB

Если это другой тип BMP, например 8-битный BMP, также в разделе заголовка будет больше данных указав фактический цвет каждого значения от 0 до 255, поэтому вам нужно будет вычесть больше из общего размера файла перед двоичным поиском.

1
ответ дан 3 December 2019 в 22:38
поделиться

Вы можете рассчитать приблизительное информационный уровень для изображения путем деления исходного размера изображения на количество пикселей:

info = fileSize / (width * height);

У меня есть изображение размером 369636 байт и 1200x800 пикселей, поэтому оно использует ~ 0,385 байта на пиксель.

У меня меньшая версия то есть 101111 байт и 600x400 пикселей, поэтому он использует ~ 0,4213 байта на пиксель.

Когда вы уменьшаете изображение, вы увидите, что оно обычно будет содержать немного больше информации на пиксель, в данном случае примерно на 9% больше. В зависимости от вашего типа изображений и степени их сжатия вы сможете рассчитать среднее значение увеличения соотношения информации / пикселей (c), так что вы можете рассчитать приблизительный размер файла:

newFileSize = (fileSize / (width * height)) * (newWidth * newHeight) * c

Из этого вы можете извлечь формулу того, насколько большим вам нужно сделать изображение, чтобы достичь определенного размера файла:

newWidth * newHeight = (newFileSize / fileSize) * (width * height) / c

Это позволит вам довольно близко к желаемому размеру файла . Если вы хотите приблизиться, вы можете изменить размер изображения до рассчитанного, сжать его и вычислить новое значение в байтах на пиксель из полученного размера файла.

9
ответ дан 3 December 2019 в 22:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: