Страница 1 из 1

Преобразование картинки 4х3 в 16х9

СообщениеДобавлено: 24.11.2011 (Чт) 22:25
Admiralisimys
Здравствуйте.

Хочу подойти к вопросу с теоретическим обоснованием.
Эмпирично был получен следующий вывод. В целевой картинке сдвигаем изображение на 0.125 высоты исходной картинки (на GdiPlus это было бы так TranslateTransform(0, 0.125 * img.Height)) и сжимаем изображение до 0.75 (ScaleTransform(1, 0.75))

А как это же описать математически? Исходя из пропорций и прочего. С какой стороны подойти?
Если 0.75 ещё удалось вывести, сравнивая две картинки (размер буквы в 4х3 был 20 пикселей, а в 16х9 уже 15), то для сдвига уже нужен какой иной подход.

P.S.
В качестве примера картинок (во вложении) использовались субкартинки с DVD меню.

Re: Преобразование картинки 4х3 в 16х9

СообщениеДобавлено: 25.11.2011 (Пт) 1:55
FireFenix
Admiralisimys писал(а):А как это же описать математически? Исходя из пропорций и прочего. С какой стороны подойти?

эм.... кеп, где ты?
Admiralisimys писал(а):TranslateTransform(0, 0.125 * img.Height)) и сжимаем изображение до 0.75 (ScaleTransform(1, 0.75))


или тебе не понятно что происходит внутри функции?

Re: Преобразование картинки 4х3 в 16х9

СообщениеДобавлено: 25.11.2011 (Пт) 2:14
Admiralisimys
С пропорцией был рассчитан коэффициент сжатия. Как рассчитать сдвиг? Мне чисто для теории хочется знать. Результат подобранного значения целиком устраивает.
Реализация функций устраивает.
Если б сам, то пропорционально пересчитывал координаты пикселей.

P.S.
Вот прототип приложения с реализованным подходом, на VB.NET
Код: Выделить всё
Imports System
Imports System.IO
Imports System.Drawing
Imports System.Drawing.Imaging

Class Wide2LetterBoxConvertor
    Shared Sub Main(ByVal szFileName() As String)
        Dim img As Image
        Try
            img = Image.FromFile(szFileName(0))
        Catch
            Return
        End Try
        'img.PixelFormat = 'Похоже данный параметр определяется некорректно,
        'по отношению к исходному файлу
        Dim imgWide As New Bitmap(img.Width, img.Height, img.PixelFormat)

        Dim grfxWide As Graphics = Graphics.FromImage(imgWide)

        grfxWide.TranslateTransform(0, 0.125 * img.Height)
        grfxWide.ScaleTransform(1, 0.75)

        grfxWide.DrawImage(img, Point.Empty)
        grfxWide.Dispose()

        imgWide.Save(Path.GetDirectoryName(szFileName(0)) & _
                     "\" & Path.GetFileNameWithoutExtension(szFileName(0)) & _
                     "(wide)" & Path.GetExtension(szFileName(0)), ImageFormat.Bmp) 'Hardcoded to bmp

        imgWide.Dispose()

        img.Dispose()
    End Sub
End Class

Если через него прогнать первую картинку (4х3)(подсовывал оригинал в bmp) получится примерно то, что во второй (16х9)

Re: Преобразование картинки 4х3 в 16х9

СообщениеДобавлено: 25.11.2011 (Пт) 19:20
FireFenix
Опять неразбериха...

Ты это.... давай по порядку.
Есть текст. Ты его сжал. Тебе нужно его переместить туда же где был левый угол несжатого текста?
Или всё же тебе не понятный функции и ты хочешь их не использовать, а сделать свою математику? Или использовать часть их математики?
Или тебе нужно найти точку для рисования? Или что?

Re: Преобразование картинки 4х3 в 16х9

СообщениеДобавлено: 27.11.2011 (Вс) 23:22
Admiralisimys
В первом посте представлены две картинки шаблоны, это то, что должно получатся в конечном результате. В самой задаче может быть лишь исходная 4х3 картинка.

Да, нужно найти точку рисования. Но в реализации я буду использовать нулевую точку, а вместо этого задействую страничный сдвиг (TranslateTransform). Было бы вполне логично, если б величина его значения по вертикале, соответствовала 0.15 от высоты картинки (это число и получается, если от всей картинки вычесть величину, до которой её сжимают (0.75 высоты)).
Но не тут-то было, как показали эксперименты с шаблонами, значение должно быть в районе 0.125 высоты. Иначе при перегоне первой картинки, текст размешается не на тех позициях, как во второй картинки из первого поста.

Почему? Я что-то пропустил? Исходя из того, что шаблоны верные. Особенности GdiPlus в .NET?

Re: Преобразование картинки 4х3 в 16х9

СообщениеДобавлено: 28.11.2011 (Пн) 21:56
iGrok
А откуда ты вообще взял 0.15?
У тебя есть "сжатие" до 0.75 от исходной. Если ты хочешь отцентровать новую картинку по вертикали, то получается, что тебе её нужно сдвинуть на половину разницы в размерах исходной и новой. Разница в размерах = 1 - 0.75 = 0.25. Половина от этого = 0.125
Вот и вся математика...

А, да.. Чтобы больше не считать "пропорцию" по размерам букв, вот тебе ещё немного математики:
Ты меняешь только высоту, ширина остаётся неизменной, значит:
Код: Выделить всё
old_h = 3/4 * w
w = 4/3 * old_h
new_h = 9/16 * w
new_h = 9/16 * 4/3 * old_h = 3/4 * old_h = 0.75 * old_h

Ей богу, это же всё ещё в школе проходят...

Re: Преобразование картинки 4х3 в 16х9

СообщениеДобавлено: 28.11.2011 (Пн) 22:52
Admiralisimys
iGrok спасибо!
Действительно проще простого оказалось :oops:

Re: Преобразование картинки 4х3 в 16х9

СообщениеДобавлено: 28.11.2011 (Пн) 23:40
Proxy
Мда, настолько простая тема, но я до самого ответа iGrok`а так и не понял о чём автор спрашивает :D