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

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

  1. KeSqueer

    KeSqueer Сергей

    Blog Posts:
    0
    P.P.S.
    Ошибочка была серьезная (корень забыл и квадрат...), исправил.
     
  2. Mikl___

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

    Blog Posts:
    14
    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
    Mikl___
    24-х битная битмапа, в памяти выравнивание массива не имеет значения.
    KeSqueer
    Пожалусто подробнее, RoundUp() - это округление к ближайшему наибольшему целому числу ?
    Или нахождение остатка.. Тогда наверно по модулю число взять нужно, sqrt(sq1-x) ведь в степень 0.5 можно возвести только положительное число.
     
  4. Y_Mur

    Y_Mur Active Member

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

    Clerk Забанен

    Blog Posts:
    0
    Y_Mur
    Да точно.
     
  6. KeSqueer

    KeSqueer Сергей

    Blog Posts:
    0
    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
    KeSqueer
    Вариант, конечно, но далеко не всегда даёт удачные результаты. Например, на числе 486 даст результат 29х17 (7 лишних), хотя 27х18 (нацело) явно лучше. Причём такие проколы будут наблюдаться на многих числах, которые значительно ближе к наибольшему меньшему полному квадрату, чем к наименьшему большему.
     
  8. KeSqueer

    KeSqueer Сергей

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

    Clerk Забанен

    Blog Posts:
    0
    KeSqueer
    Не то, чувствую что без рядов не обойдётся, нужно подумать..
     
  10. l_inc

    l_inc New Member

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

    t00x New Member

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