Оптимальный размер битмапы.

Discussion in 'WASM.A&O' started by Clerk, Mar 8, 2009.

  1. KeSqueer

    KeSqueer Сергей

    Blog Posts:
    0
    Joined:
    Jul 19, 2007
    Messages:
    1,183
    Location:
    Москва
    P.P.S.
    Ошибочка была серьезная (корень забыл и квадрат...), исправил.
     
  2. Mikl___

    Mikl___ Супермодератор Staff Member

    Blog Posts:
    14
    Joined:
    Jun 25, 2008
    Messages:
    3,914
    Ustus
    Спасибо за поправку. Хотелось написать "если размер строки растра не кратен 4, то она дополняется от 1 до 3 пустыми (нулевыми) байтами, чтобы длина строки оказалась кратна 4 байтам; при этом пиксель, в зависимости от содержимого поля biBitCount, может занимать 1, 4, 8, 16, 24, 32 бита, то есть выравнивание имеет смысл если biBitCount не равно 32"
    +++++000
    +++++000
    +++++000
    Рисунок подразумевал biBitCount=8
     
  3. Clerk

    Clerk Забанен

    Blog Posts:
    0
    Joined:
    Jan 4, 2008
    Messages:
    6,689
    Location:
    РБ, Могилёв
    Mikl___
    24-х битная битмапа, в памяти выравнивание массива не имеет значения.
    KeSqueer
    Пожалусто подробнее, RoundUp() - это округление к ближайшему наибольшему целому числу ?
    Или нахождение остатка.. Тогда наверно по модулю число взять нужно, sqrt(sq1-x) ведь в степень 0.5 можно возвести только положительное число.
     
  4. Y_Mur

    Y_Mur Active Member

    Blog Posts:
    0
    Joined:
    Sep 6, 2006
    Messages:
    2,494
    Clerk
    для 24битной как раз имеет ;) поэтому предпочитаю юзать 32битные :))
     
  5. Clerk

    Clerk Забанен

    Blog Posts:
    0
    Joined:
    Jan 4, 2008
    Messages:
    6,689
    Location:
    РБ, Могилёв
    Y_Mur
    Да точно.
     
  6. KeSqueer

    KeSqueer Сергей

    Blog Posts:
    0
    Joined:
    Jul 19, 2007
    Messages:
    1,183
    Location:
    Москва
    Clerk
    да
    Хорошее предложение, в трех строчках нашел еще одну ошибку :) правильно так (обозначения другие для пояснений ниже):
    Code (Text):
    1. y = RoundUp(sqrt(z));
    2. x = RounDown(sqrt(y^2-z));
    3. w = y+x, h = y-x;
    как видно, во второй строке корень теперь берется из неотрицательного числа.

    Смысл такой:
    Пусть всего точек z. В первой строке вычисляем сторону y минимального квадрата, который вмещает в себя z точек. Если у квадрата две противоположных стороны увеличить на x, а две другие уменьшить на х, получим прямоугольник с площадью s = (y+x)*(y-x) = y^2-x^2. Чем больше анизотропность такого прямоугольника, тем меньше его площадь. Для того чтобы определить до каких пор можно увеличивать x, нужно решить неравенство s >= z. Отсюда х <= sqrt(y^2-z). Из-за того, что z, y и x - целые, вводится округление. Вроде все.
     
  7. l_inc

    l_inc New Member

    Blog Posts:
    0
    Joined:
    Sep 29, 2005
    Messages:
    2,566
    KeSqueer
    Вариант, конечно, но далеко не всегда даёт удачные результаты. Например, на числе 486 даст результат 29х17 (7 лишних), хотя 27х18 (нацело) явно лучше. Причём такие проколы будут наблюдаться на многих числах, которые значительно ближе к наибольшему меньшему полному квадрату, чем к наименьшему большему.
     
  8. KeSqueer

    KeSqueer Сергей

    Blog Posts:
    0
    Joined:
    Jul 19, 2007
    Messages:
    1,183
    Location:
    Москва
    l_inc
    В общем, верно, это также запечатлено в примерах. Но он и описывался как с приоритетом к квадратной форме. Можно попробовать к y еще 1 прибавить или 2 и посмотреть варианты какие получаются, но, в общем, хз.
     
  9. Clerk

    Clerk Забанен

    Blog Posts:
    0
    Joined:
    Jan 4, 2008
    Messages:
    6,689
    Location:
    РБ, Могилёв
    KeSqueer
    Не то, чувствую что без рядов не обойдётся, нужно подумать..
     
  10. l_inc

    l_inc New Member

    Blog Posts:
    0
    Joined:
    Sep 29, 2005
    Messages:
    2,566
    KeSqueer
    Эм... Так 27х18 ближе к квадратной форме, чем 29х17. :) Т.е. не выдержано ни условие максимальной близости к квадрату, ни условие минимизации числа лишних пикселей. Хотя в большинстве случаев, конечно, даёт неплохие результаты.
     
  11. t00x

    t00x New Member

    Blog Posts:
    0
    Joined:
    Feb 15, 2007
    Messages:
    1,921
    ИМХО, условие на отношение сторон картинки необходимо, 2:1 - например.