Разверните холст / прозрачный фон в BitmapImage в приложении WPF - PullRequest
6 голосов
/ 13 января 2011

Это дополнительный вопрос к Сохранить изображение в файл с соотношением сторон в приложении WPF

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

Я создал эту иллюстрацию, чтобы показать, что я пытаюсь сделать сообщником. alt text

Я не могу найти ни способа расширения холста BitmapImage, ни способа создать изображение в памяти правильного размера с прозрачным фоном, а затем объединить два изображения вместе.

Ответы [ 3 ]

6 голосов
/ 01 апреля 2011

CroppedBitmap не поддерживает добавление пространства вокруг изображения, поэтому вместо этого вы можете создать прозрачное изображение правильного размера, используя WriteableBitmap . Если вход меньше целевого размера, этот метод увеличит его, но это легко изменить.

public static BitmapSource FitImage(BitmapSource input, int width, int height)
{
    if (input.PixelWidth == width && input.PixelHeight == height)
        return input;

    if(input.Format != PixelFormats.Bgra32 || input.Format != PixelFormats.Pbgra32)
        input = new FormatConvertedBitmap(input, PixelFormats.Bgra32, null, 0);

    //Use the same scale for x and y to keep aspect ratio.
    double scale = Math.Min((double)width / input.PixelWidth, height / (double)input.PixelHeight);

    int x = (int)Math.Round((width - (input.PixelWidth * scale))/2);
    int y = (int)Math.Round((height - (input.PixelHeight * scale))/2);


    var scaled = new TransformedBitmap(input, new ScaleTransform(scale, scale));
    var stride = scaled.PixelWidth * (scaled.Format.BitsPerPixel / 8);

    var result = new WriteableBitmap(width, height, input.DpiX, input.DpiY, input.Format,null);

    var data = new byte[scaled.PixelHeight * stride];
    scaled.CopyPixels(data, stride, 0);
    result.WritePixels(new Int32Rect(0,0,scaled.PixelWidth,scaled.PixelHeight), data, stride,x,y);
    return result;
}

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

0 голосов
/ 01 апреля 2011

Просто какой-то код на тот случай, если другие пытаются постобработать файлы из формы загрузки.

if (file.PostedFile != null)
{
    //write the new file to disk
    string cachePath = String.Format("{0}temp\\", Request.PhysicalApplicationPath);
    string photoPath = String.Format("{0}temp.png", cachePath);                
    if (!Directory.Exists(cachePath))
{
   Directory.CreateDirectory(cachePath);
}    

file.PostedFile.SaveAs(photoPath);

//resize the new file and save it to disk               
BitmapSource banana = FitImage(ReadBitmapFrame(file.PostedFile.InputStream), 640, 480);
PngBitmapEncoder encoder = new PngBitmapEncoder();
encoder.Frames.Add(BitmapFrame.Create(banana));
FileStream pngStream = new FileStream(cachePath + "test.png", FileMode.Create);
encoder.Save(pngStream);
pngStream.Close();

//set a couple images on page to the newly uploaded and newly processed files
image.Src = "temp/temp.png";
image.Visible = true;
image2.Src = "temp/test.png"; 


   image2.Visible = true;
}
0 голосов
/ 13 января 2011

Вы должны иметь возможность установить для свойства Stretch значение Uniform.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...