Запись и хранение рисования от руки высокого разрешения

Вот тот, который смещает строку в первое положение Вашего буфера. Вы могли бы хотеть это поведение так, чтобы при динамичном выделении строки можно было все еще освободить его на том же указателе, которые обрезают () возвраты:

char *trim(char *str)
{
    size_t len = 0;
    char *frontp = str;
    char *endp = NULL;

    if( str == NULL ) { return NULL; }
    if( str[0] == '\0' ) { return str; }

    len = strlen(str);
    endp = str + len;

    /* Move the front and back pointers to address the first non-whitespace
     * characters from each end.
     */
    while( isspace((unsigned char) *frontp) ) { ++frontp; }
    if( endp != frontp )
    {
        while( isspace((unsigned char) *(--endp)) && endp != frontp ) {}
    }

    if( str + len - 1 != endp )
            *(endp + 1) = '\0';
    else if( frontp != str &&  endp == frontp )
            *str = '\0';

    /* Shift the string so that it starts at str so that if it's dynamically
     * allocated, we can still free it on the returned pointer.  Note the reuse
     * of endp to mean the front of the string buffer now.
     */
    endp = str;
    if( frontp != str )
    {
            while( *frontp ) { *endp++ = *frontp++; }
            *endp = '\0';
    }


    return str;
}

Тест для правильности:

int main(int argc, char *argv[])
{
    char *sample_strings[] =
    {
            "nothing to trim",
            "    trim the front",
            "trim the back     ",
            " trim one char front and back ",
            " trim one char front",
            "trim one char back ",
            "                   ",
            " ",
            "a",
            "",
            NULL
    };
    char test_buffer[64];
    int index;

    for( index = 0; sample_strings[index] != NULL; ++index )
    {
            strcpy( test_buffer, sample_strings[index] );
            printf("[%s] -> [%s]\n", sample_strings[index],
                                     trim(test_buffer));
    }

    /* The test prints the following:
    [nothing to trim] -> [nothing to trim]
    [    trim the front] -> [trim the front]
    [trim the back     ] -> [trim the back]
    [ trim one char front and back ] -> [trim one char front and back]
    [ trim one char front] -> [trim one char front]
    [trim one char back ] -> [trim one char back]
    [                   ] -> []
    [ ] -> []
    [a] -> [a]
    [] -> []
    */

    return 0;
}

Исходный файл был trim.c. Скомпилированный с 'cc trim.c-o обрезка'.

13
задан Pekka supports GoFundMonica 31 March 2011 в 09:44
поделиться

3 ответа

для этого есть несколько апплетов в мире оэкаки: Shi painter , Chibipaint или PaintBBS . Здесь у вас есть классы php для интеграции.

Рисунки, создаваемые этими апплетами, могут иметь довольно хорошее качество. Если вы зарегистрируетесь на oekakicentral.com , вы сможете увидеть все галереи, а на некоторых рисунках есть анимационная ссылка, показывающая, как они были нарисованы (это зависит от апплета), так что вы можете сравнить возможности апплетов. Некоторые из них имеют открытый исходный код.

Edit: См. Также this сделанный в HTML 5.

7
ответ дан 1 December 2019 в 22:07
поделиться

Взгляните на : компонент Flash, который превращает рисование от руки в SVG. Затем вы можете отправить сгенерированный SVG на свой сервер.

Это бесплатно для некоммерческого использования. Согласно их сайту, цена коммерческого использования составляет 29 € . Это не открытый исходный код.

ИМХО, на это стоит взглянуть.

В качестве альтернативы, вы реализуете что-то на основе svg-edit , который является открытым исходным кодом и использует jQuery ( демонстрация ) . Если требуется подключаемый модуль Google Frame для поддержки IE6 +.

РЕДАКТИРОВАТЬ: Я только что нашел проект svg-freehand-signature ( демонстрация ), который фиксирует ваш собственноручная подпись и отправляет ее на сервер в формате SVG с помощью POST. Это' s распространяется как простой и автономный zip-архив (работает из коробки с Safari и Firefox, вы можете комбинировать его с svgweb , который обеспечивает поддержку SVG в Internet Explorer ).

РЕДАКТИРОВАТЬ: я успешно объединил Canvaslol Сесара Оливейры (просто посмотрите на исходный код страницы, чтобы увидеть, как это работает) с ExplorerCanvas , чтобы получить что-то в IE. Вы также можете посмотреть эксперимент Энн ван Кестерен Paintr .

s canvaslol (просто посмотрите на исходный код страницы, чтобы увидеть, как это работает) с ExplorerCanvas , чтобы иметь что-нибудь в IE. Вы также можете посмотреть эксперимент Энн ван Кестерен Paintr .

s canvaslol (просто посмотрите на исходный код страницы, чтобы увидеть, как это работает) с ExplorerCanvas , чтобы иметь что-нибудь в IE. Вы также можете посмотреть эксперимент Энн ван Кестерен Paintr .

4
ответ дан 1 December 2019 в 22:07
поделиться

Я сомневаюсь, что вы получите что-либо более высокое разрешение, чем дает вам событие "onmousemove", без написания эффективной программы ассемблера для какой-либо встроенной системы, специально созданной для этой цели. Вы работаете внутри ОС, вы играете по правилам ОС, что означает, что вы ограничены частотой временных интервалов, которые ОС будет предоставлять вам. (обычно около 100 в секунду, колеблется в зависимости от нагрузки) Я не использовал планшет, который может решить проблему "многоугольника", и я использовал некоторые планшеты высокого класса. Photoshop решает проблему с кубической интерполяцией.

То есть, если только у вас нет специального планшета, который будет захватывать множество событий движения и помещать их в очередь в некоторый внутренний буфер, а также отправлять целый пакет координат одновременно с отправкой данных в ОС. Я' Тем не менее, мы рассмотрели API-интерфейсы планшета, и они выдают только один набор координат за раз, поэтому, если это произойдет, вам понадобится специальное оборудование, пользовательский драйвер и пользовательский API, который может обрабатывать пакеты с несколькими координатами.

Или вы можете просто использовать проклятый тег canvas , событие onmousemove , event.pageX | pageY некоторую кубическую интерполяцию , api "toDataURI" холста, опубликуйте результат в свой php-скрипт, а затем просто скажите, что вы сделали все эти другие причудливые вещи.

onmousemove, в моих тестах, выдает одно событие на пиксель движения, ограниченное только скоростью цикла событий в браузере. Вы получите разреженные точки данных (многоугольники) с быстрым перемещением, и это ' настолько хороша, насколько это возможно без гранта на огромные исследования и разработчика оборудования. Сделка.

12
ответ дан 1 December 2019 в 22:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: