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

Различные алгоритмы, связанные с выводом графики.
Admiralisimys
Постоялец
Постоялец
 
Сообщения: 315
Зарегистрирован: 01.06.2009 (Пн) 10:26

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

Сообщение Admiralisimys » 24.11.2011 (Чт) 22:25

Здравствуйте.

Хочу подойти к вопросу с теоретическим обоснованием.
Эмпирично был получен следующий вывод. В целевой картинке сдвигаем изображение на 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 меню.
Вложения
4х3.PNG
16х9.PNG

FireFenix
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1640
Зарегистрирован: 25.05.2007 (Пт) 10:24
Откуда: Mugen no Sora

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

Сообщение FireFenix » 25.11.2011 (Пт) 1:55

Admiralisimys писал(а):А как это же описать математически? Исходя из пропорций и прочего. С какой стороны подойти?

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


или тебе не понятно что происходит внутри функции?
Птицей Гермеса меня называют, свои крылья пожирая... сам себя я укрощаю
私はヘルメスの鳥 私は自らの羽根を喰らい 飼い慣らされる

Admiralisimys
Постоялец
Постоялец
 
Сообщения: 315
Зарегистрирован: 01.06.2009 (Пн) 10:26

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

Сообщение Admiralisimys » 25.11.2011 (Пт) 2:14

С пропорцией был рассчитан коэффициент сжатия. Как рассчитать сдвиг? Мне чисто для теории хочется знать. Результат подобранного значения целиком устраивает.
Реализация функций устраивает.
Если б сам, то пропорционально пересчитывал координаты пикселей.

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)

FireFenix
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1640
Зарегистрирован: 25.05.2007 (Пт) 10:24
Откуда: Mugen no Sora

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

Сообщение FireFenix » 25.11.2011 (Пт) 19:20

Опять неразбериха...

Ты это.... давай по порядку.
Есть текст. Ты его сжал. Тебе нужно его переместить туда же где был левый угол несжатого текста?
Или всё же тебе не понятный функции и ты хочешь их не использовать, а сделать свою математику? Или использовать часть их математики?
Или тебе нужно найти точку для рисования? Или что?
Птицей Гермеса меня называют, свои крылья пожирая... сам себя я укрощаю
私はヘルメスの鳥 私は自らの羽根を喰らい 飼い慣らされる

Admiralisimys
Постоялец
Постоялец
 
Сообщения: 315
Зарегистрирован: 01.06.2009 (Пн) 10:26

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

Сообщение Admiralisimys » 27.11.2011 (Вс) 23:22

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

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

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

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4254
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

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

Сообщение iGrok » 28.11.2011 (Пн) 21:56

А откуда ты вообще взял 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

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

Admiralisimys
Постоялец
Постоялец
 
Сообщения: 315
Зарегистрирован: 01.06.2009 (Пн) 10:26

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

Сообщение Admiralisimys » 28.11.2011 (Пн) 22:52

iGrok спасибо!
Действительно проще простого оказалось :oops:

Proxy
Профессор VB наук
Профессор VB наук
Аватара пользователя
 
Сообщения: 2853
Зарегистрирован: 31.08.2007 (Пт) 4:41

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

Сообщение Proxy » 28.11.2011 (Пн) 23:40

Мда, настолько простая тема, но я до самого ответа iGrok`а так и не понял о чём автор спрашивает :D
Follow the white rabbit.


Вернуться в Графика

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1

    TopList