0

Я нашел много примеров того, как масштабировать изображение в Windows Forms, но в этом случае я использую массив байтов в приложении Windows Store. Это код фрагмента, который я использую.Как масштабировать изображение до половины размера через массив байтов?

// Now that you have the raw bytes, create a Image Decoder 
BitmapDecoder decoder = await BitmapDecoder.CreateAsync(fileStream); 

// Get the first frame from the decoder because we are picking an image 
BitmapFrame frame = await decoder.GetFrameAsync(0); 

// Convert the frame into pixels 
PixelDataProvider pixelProvider = await frame.GetPixelDataAsync(); 

// Convert pixels into byte array 
srcPixels = pixelProvider.DetachPixelData(); 
wid = (int)frame.PixelWidth; 
hgt =(int)frame.PixelHeight; 

// Create an in memory WriteableBitmap of the same size 
bitmap = new WriteableBitmap(wid, hgt); 
Stream pixelStream = bitmap.PixelBuffer.AsStream(); 
pixelStream.Seek(0, SeekOrigin.Begin); 

// Push the pixels from the original file into the in-memory bitmap 
pixelStream.Write(srcPixels, 0, (int)srcPixels.Length); 
bitmap.Invalidate(); 

В этом случае он просто создает копию потока. Я не знаю, как манипулировать массивом байтов, чтобы уменьшить его до половины ширины и высоты.

ответ

0

Если вы посмотрите на the MSDN documentation на номер GetPixelDataAsync, вы увидите, что у него есть перегрузка, которая позволяет указать BitmapTransform, который будет применяться во время операции.

Таким образом, вы можете сделать это в вашем примере кода, что-то вроде этого:

// decode a frame (as you do now) 
BitmapDecoder decoder = await BitmapDecoder.CreateAsync(fileStream); 
BitmapFrame frame = await decoder.GetFrameAsync(0); 

// calculate required scaled size 
uint newWidth = frame.PixelWidth/2; 
uint newHeight = frame.PixelHeight/2; 

// convert (and resize) the frame into pixels 
PixelDataProvider pixelProvider = 
    await frame.GetPixelDataAsync(
     BitmapPixelFormat.Rgba8, 
     BitmapAlphaMode.Straight, 
     new BitmapTransform() { ScaledWidth = newWidth, ScaledHeight = newHeight}, 
     ExifOrientationMode.RespectExifOrientation, 
     ColorManagementMode.DoNotColorManage); 

Теперь вы можете вызвать DetachPixelData как в исходном коде, но это даст вам уменьшенное изображение вместо полного размера образ.

srcPixels = pixelProvider.DetachPixelData(); 

// create an in memory WriteableBitmap of the scaled size 
bitmap = new WriteableBitmap(newWidth, newHeight); 
Stream pixelStream = bitmap.PixelBuffer.AsStream(); 
pixelStream.Seek(0, SeekOrigin.Begin); 

// push the pixels from the original file into the in-memory bitmap 
pixelStream.Write(srcPixels, 0, (int)srcPixels.Length); 
bitmap.Invalidate(); 
Смежные вопросы