Почему размер файла не всегда изменяется при настройке JpegBitmapEncoder QualityLevel? - PullRequest
0 голосов
/ 08 апреля 2019

Я пытаюсь сохранить WritableBitmap и убедиться, что размер получаемого файла меньше определенного размера. Мой код выглядит следующим образом

//Fetch Image from file
BitmapImage bitmap = new BitmapImage(new Uri("YourImage.jpg", UriKind.Relative));
WriteableBitmap writableBitmapImage = new WriteableBitmap(bitmap);

//initialize variables and values
MemoryStream stream;
JpegBitmapEncoder encoder;
byte[] result;
int quality = 100;

//loop through save process, checking file size and changing quality
while (selected.maxFileSize < result.Length && quality > 1)
{
    encoder = new JpegBitmapEncoder();
    stream = new MemoryStream();
    encoder.QualityLevel = quality;
    encoder.Frames.Add(BitmapFrame.Create(
        ReplaceTransparency(writableBitmapImage, Colors.White))
    );
    encoder.Save(stream);
    result = stream.GetBuffer();
    if (quality > 5) quality += -5;
    else quality--;
}

Когда я запускаю этот код, я не вижу никаких изменений размера файла от начальной точки QualityLevel = 100; до QualityLevel = 10;.

На QualityLevel = 5; Я вижу большое изменение в размере файла.

Есть ли способ контролировать размер файла более детально?

1 Ответ

2 голосов
/ 09 апреля 2019

Прочитайте документацию для MemoryStream.GetBuffer():

Обратите внимание, что буфер содержит выделенные байты, которые могут быть не использованы. Например, если строка «test» записана в объект MemoryStream, длина буфера, возвращаемого из GetBuffer, составляет 256, а не 4, при этом 252 байта не используются. Чтобы получить только данные в буфере, используйте метод ToArray; однако ToArray создает копию данных в памяти.

Затем используйте .ToArray().

...