2014-02-16 6 views
2

Я использую следующий код, чтобы сохранить изображение холстатолько верхняя часть изображения сохраняются

if (!Directory.Exists(DefaultSettings.MainPath + "//Skeleton Images//")) 
    Directory.CreateDirectory(DefaultSettings.MainPath + "//Skeleton Images//"); 
System.Windows.Size size = new System.Windows.Size(canvas.Width, canvas.Height); 
canvas.Measure(size); 
canvas.Arrange(new System.Windows.Rect(size)); 
RenderTargetBitmap renderBitmap = new RenderTargetBitmap((int)size.Width, (int)size.Height, 96d, 96d, PixelFormats.Pbgra32); 
renderBitmap.Render(canvas); 
using (FileStream outstream = new FileStream(DefaultSettings.MainPath + "//Skeleton Images//Kinected (" + images + ").jpg", FileMode.Create)) 
{ 
    JpegBitmapEncoder cEncoder = new JpegBitmapEncoder(); 
    cEncoder.Frames.Add(BitmapFrame.Create(renderBitmap)); 
    cEncoder.Save(outstream); 
} 

Тем не менее, только сохраняя верхнюю часть изображения. Хотя размер изображения составляет 321x240, а размер холста также имеет тот же размер. Почему это происходит? этот же код, используемый до сохранения всего холста, так почему же это внезапно создает ошибки? Рисунок ниже, чтобы проиллюстрировать проблему. Также обратите внимание, что холст помещается поверх изображения, так как они визуализируются отдельно, а холст распространяется вплоть до текста «Цветная рамка».

Only top portion saved

ответ

3

Хотя размер изображения 321x240, а размер холста также тот же размер

Они делают, но они не используют одни и те же единицы. Размер растрового изображения находится в пикселях, размер холста находится в единицах 1/96 дюймов. Которая имеет тенденцию работать нормально, поскольку на многих машинах одинаковая сумма. Но не тогда, когда вы запускаете машину с настройкой разных точек на дюйм для видеоадаптера. В более поздних версиях Windows это очень просто изменить, с предварительно приготовленными выделениями на 125% и 150%. Как и вы.

Вы должны создать больше bitmap в пикселях. Уже хорошо покрыт this question.

1

Try размер находка таким образом:

private static Size SizeCalculation(Size image, Size boundingBox) 
{  
    double widthScale = 0, heightScale = 0; 
    if (image.Width != 0) 
     widthScale = (double)boundingBox.Width/(double)image.Width; 
    if (image.Height != 0) 
     heightScale = (double)boundingBox.Height/(double)image.Height;     

    double scale = Math.Min(widthScale, heightScale); 

    Size result = new Size((int)(image.Width * scale), 
         (int)(image.Height * scale)); 
    return result; 
} 

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

Смежные вопросы