Я нашел ответ. Я могу использовать .AsQueryable<>()
дополнительный метод для преобразования моего списка в IQueryable, затем выполнить динамический порядок против него.
Это зависит от того, что вы хотите изменить.
Трудно предположить, каков будет окончательный размер диска, но если вы знаете начальную точку, вы можете получить довольно хорошую оценку. Уменьшение размера, вероятно, будет пропорциональным, уменьшение количества бит на пиксель также, вероятно, будет пропорциональным.
Если вы меняете формат, сжатие или качество, это на самом деле только предположение - сильно зависит от содержимого изображения.
Если это 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, поэтому вам нужно будет вычесть больше из общего размера файла перед двоичным поиском.
Вы можете рассчитать приблизительное информационный уровень для изображения путем деления исходного размера изображения на количество пикселей:
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
Это позволит вам довольно близко к желаемому размеру файла . Если вы хотите приблизиться, вы можете изменить размер изображения до рассчитанного, сжать его и вычислить новое значение в байтах на пиксель из полученного размера файла.