Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« : 06-09-2011 07:59 » |
|
Мне скоро потребуется сделать такую вещь - покадрово рисовать будущий гиф, затем собирать его в готовый стандартный анимированный файл
вот такой вопрос - в WINAPI, DirectX или GDI+ есть ли какой-то компонент, которы поможет в этом нелёгком деле, или весь формат придётся вручную лопатить ? Особенно вопрос про сжатие - что там используется ?
Пока только удочку закидываю, вдруг кто работал , сам я только вечером смогу порыться и поискать детали
|
|
|
Записан
|
|
|
|
RXL
|
|
« Ответ #1 : 06-09-2011 08:18 » |
|
Леш, думаю, что тебе нужно воспользоваться сторонней библиотекой. Только ищи ту, которая поддерживает многокадровость. http://ru.wikipedia.org/wiki/GIF
|
|
« Последнее редактирование: 06-09-2011 08:22 от RXL »
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #2 : 06-09-2011 08:21 » |
|
ок, поищу
|
|
|
Записан
|
|
|
|
zubr
Гость
|
|
« Ответ #3 : 06-09-2011 10:22 » |
|
Алексей1153++, CDI+ вполне сгодится. Смотри в сторону class Image : public GdiplusBase, метод Image::SaveAdd, хидер GdiplusHeaders.h
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #4 : 06-09-2011 15:58 » |
|
zubr, спасибо.
|
|
|
Записан
|
|
|
|
baldr
|
|
« Ответ #5 : 07-09-2011 06:37 » |
|
|
|
|
Записан
|
Приличный компьютер всегда будет стоить дороже 1000 долларов, потому что 500 долларов - это не вполне прилично
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #6 : 07-09-2011 06:59 » |
|
baldr, спасибо, тоже пригодится )
Ещё не смотрел детально ничего - зак пока телится, выбирает кандидатов. Я другим заданием поэтому щас занят ))
|
|
|
Записан
|
|
|
|
RuNTiME
|
|
« Ответ #7 : 07-09-2011 07:32 » |
|
|
|
|
Записан
|
Любимая игрушка - debugger ...
|
|
|
RXL
|
|
« Ответ #8 : 07-09-2011 08:18 » |
|
Версия GIF87 не поддерживает анимацию - только GIF89.
Добавлено через 52 секунды: GIFLIB я первым делом осмотрел. Проект заморожен в 2005-2006 году. Качество и степень готовности не ясны.
|
|
« Последнее редактирование: 07-09-2011 08:19 от RXL »
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #9 : 07-09-2011 09:50 » |
|
всё, он созрел ) Вечером приступаю к разбирательствам, потом отпишусь, что вышло для памяти ссылку оставлю http://www.rsdn.ru/article/gdi/gdiplus2mag.xmlhttp://www.w3.org/Graphics/GIF/spec-gif89a.txthttp://home.onego.ru/~chiezo/gif.htm (картинисто) Добавлено через 6 часов, 27 минут и 37 секунд:вот сразу какие-то невнятные проблемы #include "GdiplusHeaders.h"
Gdiplus::Image* I1=0; I1=I1->FromFile(L"1.gif"); // возвращает 0
Gdiplus::Image I2(L"1.gif"); //валится
файл 1.gif - лежит на диске рядом с экзешником (впрочем, полный путь тоже пробовал) второй вариант вылится здесь: Image::Image( IN const WCHAR* filename, IN BOOL useEmbeddedColorManagement ) { nativeImage = NULL; if(useEmbeddedColorManagement) { lastResult = DllExports::GdipLoadImageFromFileICM( filename, &nativeImage ); } else { lastResult = DllExports::GdipLoadImageFromFile( // <<<<<<<<<<<<<<<<<<<<<< ВОТ ТУТ filename, &nativeImage ); } }
при этом пищит про такое ощущение, что где-то неправильно описан экспорт из GdiPlus.dll (если правильно понимаю) Добавлено через 23 минуты и 17 секунд:попробовал вызвать функцию вручную - тот же результат! При этом адрес функции очень странный Gdiplus::GpStatus (WINGDIPAPI *_GdipLoadImageFromFile)(GDIPCONST WCHAR* filename, Gdiplus::GpImage **image)=0;
HMODULE h=::LoadLibrary(L"GdiPlus.dll");
((void*&)_GdipLoadImageFromFile)=::GetProcAddress(h,"GdipLoadImageFromFile"); //_GdipLoadImageFromFile==0x4ec1c8d8
Gdiplus::GpImage* nativeImage=0; Gdiplus::Status lastResult = _GdipLoadImageFromFile(L"1.gif",&nativeImage);
|
123.GIF (4.7 Кб - загружено 2950 раз.)
|
« Последнее редактирование: 08-09-2011 06:31 от Алексей1153++ »
|
Записан
|
|
|
|
zubr
Гость
|
|
« Ответ #10 : 07-09-2011 17:41 » |
|
А ты инициализацию GDI+ сделал? - GdiplusStartup
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #11 : 07-09-2011 17:45 » |
|
нет, откуда ж знать ) Щас попробую
Добавлено через 14 минут и 7 секунд: ага, оно самое
Добавлено через 16 минут и 35 секунд: А создать "чистый" экземпляр Image, выходит, нельзя ? То есть, только из существующего файла или стрима ?
|
|
« Последнее редактирование: 07-09-2011 18:16 от Алексей1153 »
|
Записан
|
|
|
|
zubr
Гость
|
|
« Ответ #12 : 07-09-2011 19:26 » |
|
Почему нельзя. 1. Создай объект Bitmap(IN INT width, IN INT height, IN PixelFormat format = PixelFormat32bppARGB); 2. Создай объект Graphics(IN Image* image) по битмапу. 3. Рисуешь, используя методы Graphics 4. Сохраняешь битмап Bitmap::Save
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #13 : 07-09-2011 19:53 » |
|
понятно, спасибо. А вот ещё проблема - не пойму, как добавить новые кадры (не содержимое, а именно в принципе ещё кадры) ? В примере http://msdn.microsoft.com/en-us/library/ms535408(v=VS.85).aspxиспользуется файл , у которого уже 4 кадра есть, их просто перерисовывают. Если же у меня гиф однокадровый, то SaveAdd для 2 кадра обламывается Gdiplus::Status st;
Gdiplus::EncoderParameters ep={0}; ULONG parameterValue=0; GUID dimension = Gdiplus::FrameDimensionPage;
// An EncoderParameters object has an array of // EncoderParameter objects. In this case, there is only // one EncoderParameter object in the array. ep.Count = 1;
// Initialize the one EncoderParameter object. ep.Parameter[0].Guid = Gdiplus::EncoderSaveFlag; ep.Parameter[0].Type = Gdiplus::EncoderParameterValueTypeLong; ep.Parameter[0].NumberOfValues = 1; ep.Parameter[0].Value = ¶meterValue;
Gdiplus::Image I1(L"1.gif"); Gdiplus::Image I2(L"2.gif");
// Get the CLSID of the GIF encoder. CLSID encoderClsid; GetEncoderClsid(L"image/gif", &encoderClsid);
//сохраняем новый гиф st=I2.Save(L"3.gif",&encoderClsid); //создаётся нормально
// пытаемся добавить ещё кадр parameterValue = Gdiplus::EncoderValueFrameDimensionPage; st=I2.SelectActiveFrame(&dimension, 1); //неудачно //st==Win32Error
st=I2.SaveAdd(&I1,&ep);
// Close the multiframe file. parameterValue = Gdiplus::EncoderValueFlush; st=I2.SaveAdd(&ep);
И ещё - не могу найти, где определена GetEncoderClsid (используется в примерах) , победил только взяв с левого сайта реализацию GetEncoderClsid http://d34dm4st3rs.narod.ru/hkc/gdi32_shpion.htmlДобавлено через 13 минут и 44 секунды:дело у меня в том, что кадров будет случайное количество. Их надо как-то на лету добавлять , Добавлено через 8 минут и 38 секунд:Более того, если загружаю многокадровый, сохраняю - там остаётся один кадр O_O
|
|
« Последнее редактирование: 07-09-2011 20:16 от Алексей1153 »
|
Записан
|
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #15 : 08-09-2011 05:19 » |
|
что же я не так делаю то какая-то головоломка ))) Gdiplus::Status st;
Gdiplus::EncoderParameters ep={0}; ULONG parameterValue=0; GUID dimension = Gdiplus::FrameDimensionPage;
// Initialize the one EncoderParameter object. ep.Count = 1; ep.Parameter[0].Guid = Gdiplus::EncoderSaveFlag; ep.Parameter[0].Type = Gdiplus::EncoderParameterValueTypeLong; ep.Parameter[0].NumberOfValues = 1; ep.Parameter[0].Value = ¶meterValue;
Gdiplus::Image I1(L"1.gif"); Gdiplus::Image I2(L"2.gif");
// Get the CLSID of the GIF encoder. CLSID encoderClsid; GetEncoderClsid(L"image/gif", &encoderClsid);
//сохраняем новый гиф parameterValue = Gdiplus::EncoderValueMultiFrame; st=I2.Save(L"3.gif",&encoderClsid,&ep); //создаётся нормально
//дальше ничего не работает
// пытаемся добавить ещё кадр parameterValue = Gdiplus::EncoderValueFrameDimensionPage; st=I2.SaveAdd(&ep); //работаем с новым кадром st=I2.SelectActiveFrame(&dimension, 1); //записываем туда I1 parameterValue = Gdiplus::EncoderValueFrameDimensionPage; st=I2.SaveAdd(&I1,&ep);
//заканчиваем работу с файлом parameterValue = Gdiplus::EncoderValueFlush; st=I2.SaveAdd(&ep);
Добавлено через 41 секунду:вместо второго и третьего "EncoderValueMultiFrame" также попробовал "EncoderValueFrameDimensionPage" - тоже без эффекта (код в посте я подправил) Добавлено через 19 минут и 38 секунд:вот отсюда беру готовый пример http://topic.csdn.net/u/20071129/09/2892016a-aafe-4743-862b-037f1279c054.htmlи только убираю инициализацию и один кадр, всё остальное без изменений. Добавление кадра всё равно не удаётся { Gdiplus::EncoderParameters encoderParameters; Gdiplus::Status stat; ULONG parameterValue;
// An EncoderParameters object has an array of // EncoderParameter objects. In this case, there is only // one EncoderParameter object in the array. encoderParameters.Count = 1;
// Initialize the one EncoderParameter object. encoderParameters.Parameter[0].Guid = Gdiplus::EncoderSaveFlag; encoderParameters.Parameter[0].Type = Gdiplus::EncoderParameterValueTypeLong; encoderParameters.Parameter[0].NumberOfValues = 1; encoderParameters.Parameter[0].Value = ¶meterValue;
// Get the CLSID of the TIFF encoder. CLSID encoderClsid; GetEncoderClsid(L"image/gif", &encoderClsid);
// Create four image objects. Gdiplus::Image* multi = new Gdiplus::Image(L"1.gif"); Gdiplus::Image* page2 = new Gdiplus::Image(L"2.gif"); Gdiplus::Image* page3 = new Gdiplus::Image(L"3.gif");
// Save the first page (frame). parameterValue = Gdiplus::EncoderValueMultiFrame; stat = multi->Save(L"123.gif", &encoderClsid, &encoderParameters);
//дальше - косяки
// Save the second page (frame). parameterValue = Gdiplus::EncoderValueFrameDimensionPage; stat = multi->SaveAdd(page2, &encoderParameters);
// Save the third page (frame). parameterValue = Gdiplus::EncoderValueFrameDimensionPage; stat = multi->SaveAdd(page3, &encoderParameters);
// Close the multiframe file. parameterValue = Gdiplus::EncoderValueFlush; stat = multi->SaveAdd(&encoderParameters);
delete multi; delete page2; delete page3; return; } блин, может что-то с версией GDIPLUS.DLL ? Добавлено через 22 минуты и 49 секунд:всё, пойду велосипед изобретать - вручную весь файл )))
|
|
« Последнее редактирование: 08-09-2011 06:07 от Алексей1153 »
|
Записан
|
|
|
|
zubr
Гость
|
|
« Ответ #16 : 08-09-2011 06:46 » |
|
Для первого кадра parameterValue должен быть EncoderValueMultiFrame, для последующих - EncoderValueFrameDimensionTime
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #17 : 08-09-2011 07:19 » |
|
zubr, с EncoderValueFrameDimensionTime ничего не поменялось Пока что разбираюсь с "ручным" форматом. Кстати - отличная для этого дока вот http://home.onego.ru/~chiezo/gif.htm
|
|
|
Записан
|
|
|
|
zubr
Гость
|
|
« Ответ #18 : 08-09-2011 07:40 » |
|
Алексей1153++, у себя проверил, в 7-ке получается, в xp нет. Видно надо более новая версия GdiPlus.dll
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #19 : 08-09-2011 07:52 » |
|
zubr, можешь копию прислать на почту? Только пароль единичку поставь, а то яндекс не пропустит. Заранее спасибо )
Если всё ок, я тогда к экзешнику приложу dll
|
|
« Последнее редактирование: 08-09-2011 14:19 от Алексей1153++ »
|
Записан
|
|
|
|
zubr
Гость
|
|
« Ответ #20 : 08-09-2011 08:23 » |
|
Алексей1153++, в xp с GdiPlus.dll от 7-ки все равно не работает.
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #21 : 08-09-2011 08:23 » |
|
zubr, это заговор ) Ладно, всё равно уже копаюсь с форматом. Видать, это карма ))
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #22 : 09-09-2011 17:37 » |
|
ааа, запарка! Спасите ))) Вроде же разобрался с форматом вдоль и поперёк, а всё равно что-то не так... Вернее, на алгоритме LZW что-то у меня не так. По теории получается одна последовательность, а программы-просмотрщики не понимают, кроме того - если из программ сохранять точно такой же гиф, то у них сжатая часть совсем другая по содержанию - причём я совершенно не могу въехать, по какому принципу
сейчас примеры закину, может кто подскажет, в какую сторону копать (
|
|
|
Записан
|
|
|
|
RuNTiME
|
|
« Ответ #23 : 09-09-2011 18:01 » |
|
|
|
|
Записан
|
Любимая игрушка - debugger ...
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #24 : 09-09-2011 19:29 » |
|
рассказываю по порядку 1) пусть для примера имеем такую картинку fit1.gif 2*4 , 8 битную. В ней 6 белых пикселов сверху и 2 чёрных снизу. (она тут очень маленькая - плохо видно. Смотрите в аттаче) этот гиф создан графпрограммой и корректен до невозможности - на него равняемся. Содержимое гифа такое: длинная палитра, кстати, - 256 элементов, из них используются только первые 2. Хотя, это неважно в моём вопросе (ну, так захотелось программе, что ли) 2) теперь создаю в своей программе такой же битмап и засовываю его в формат гиф по инструкции http://home.onego.ru/~chiezo/gif.htm сохраняю в файл 1234.gif содержимое этот файл графпрограммы не понимают ( вернее, размер понимают правильно, а пикселы не те) несмотря на большое визуальное различие хексов, 1234.gif отличается от fit1.gif только блоком сжатой графики, всё остальное сделано корректно. доказательство: заменяем корявый блок графики файла 1234.gif ( 04 0B 0C 0D 01 , где 04 - длина данных) на соответствующий блок из fit1.gif ( 08 00 01 08 1C 18 20 40 40 , где 08 - длина данных)и графпрограмма сразу же начинает воспринимать и показывать гиф так, как нужно Вывод - я косячу в алгоритме сжатия. Но я его изучил хорошо, он несложный http://home.onego.ru/~chiezo/lzw.htmВ процессе упаковки получаю следующий словарь: 0 0, (индекс чёрного цвета) 1 1, (индекс белого цвета) 2 2, 3 3, 4 4, 5 5, 6 6, 7 7, 8 8, 9 9,==<CC> a a,==<EOI> b 0,0 c 0,0,0 d 0,1 архив у меня получился такой [0B 0C 0D 01] если согласно нему раскодировать, картинка должна получиться ЧТО ЖЕ я опять не учёл ? Добавлено через 3 минуты и 33 секунды:RuNTiME, щас гляну, спасибо. Я уже в отчаянии )) сроки горят Добавлено через 3 минуты и 5 секунд:RuNTiME, кстати, таких исходников на чистом Си я много находил, но за каждый страшно браться ) Видимо, придётся всё же
|
1__1.PNG (12.82 Кб - загружено 2928 раз.)
fit1.gif (0.78 Кб - загружено 2930 раз.)
1__3.PNG (2.73 Кб - загружено 2897 раз.)
|
« Последнее редактирование: 09-09-2011 19:33 от Алексей1153 »
|
Записан
|
|
|
|
RuNTiME
|
|
« Ответ #25 : 09-09-2011 19:37 » |
|
Я уже в отчаянии )) сроки горят Алексей1153++, Так может лучше взять готовую библиотеку? А потом, когда сроки перестанут гореть, можно и с форматами по разбираться в свое удовольствие....
|
|
|
Записан
|
Любимая игрушка - debugger ...
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #26 : 09-09-2011 19:44 » |
|
RuNTiME, да я не против, я не нашёл такую. Мне исходники нужны, так как это должна быть отдельная одинокая DLL Сейчас код по твоей ссылке скопировал - а там нумерация строк Хвала аллаху, что в студии макросы есть, за минуту убрал нумерацию Добавлено через 2 минуты и 8 секунд:тут вот тоже полезная, должно быть, функция, только там куча неизвестных типов, да и параметры не описаны - что к чему http://www.solidfluid.co.uk/sfsite.php/000000D6
|
|
« Последнее редактирование: 09-09-2011 19:50 от Алексей1153++ »
|
Записан
|
|
|
|
RuNTiME
|
|
« Ответ #27 : 09-09-2011 19:53 » |
|
Сейчас код по твоей ссылке скопировал - а там нумерация строк... Алексей1153++, эмм там все гораздо проще... когда наводишь мышку на исходники, в правом верхнем углу 3 кнопочки появляются одна из них View Source тут вот тоже полезная, должно быть, функция, только там куча неизвестных типов... Там примерчики есть: ToGIF, FromGIF...
|
|
|
Записан
|
Любимая игрушка - debugger ...
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #28 : 09-09-2011 20:01 » |
|
ок, понятно. Там, оказывается, по файлам раскидано, а я то думаю - что половины не хватает )
|
|
|
Записан
|
|
|
|
RuNTiME
|
|
« Ответ #29 : 09-09-2011 20:05 » |
|
Алексей1153++, А можно и в сторону giflib посмотреть, не знаю почему её сразу отклонили, она по умолчанию в последней ubuntu'шке используется и под винду её можно скомпилить...
|
|
|
Записан
|
Любимая игрушка - debugger ...
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #30 : 09-09-2011 20:07 » |
|
где кто что отклонил ? Я ничего не отклонял )
А с этими исходниками всё равно что-то неладно - например, структуры Colour и GifPalette нигде не определены
Добавлено через 1 минуту и 46 секунд: ааа, увидел. Я как-то пропустил этот пост
|
|
« Последнее редактирование: 09-09-2011 20:09 от Алексей1153 »
|
Записан
|
|
|
|
RXL
|
|
« Ответ #31 : 09-09-2011 20:17 » |
|
Леш, а какая религия запрещает использовать готовые библиотеки? Сомневаюсь, что поиск нужного будет медленнее аврального написания своего кодера.
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #32 : 09-09-2011 20:19 » |
|
RXL, да не нашёл я готовых. Или искать не умею Вот сейчас пытаюсь вот это скомпилить А можно и в сторону giflib посмотреть,
|
|
|
Записан
|
|
|
|
RuNTiME
|
|
« Ответ #33 : 09-09-2011 20:20 » |
|
А с этими исходниками всё равно что-то неладно - например, структуры Colour и GifPalette нигде не определены Упс Там оказывается не все исходники... Вот ссылка на все исходники: http://enchantia.com/graphapp/package/src/Эти структуры определены в app.h
|
|
|
Записан
|
Любимая игрушка - debugger ...
|
|
|
RXL
|
|
« Ответ #34 : 09-09-2011 20:26 » |
|
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #35 : 09-09-2011 20:28 » |
|
RuNTiME, а это возможно как-то всё разом скачать ?
|
|
|
Записан
|
|
|
|
RuNTiME
|
|
« Ответ #36 : 09-09-2011 20:29 » |
|
|
|
|
Записан
|
Любимая игрушка - debugger ...
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #37 : 09-09-2011 20:29 » |
|
Ром, это я только что пытался использовать - не продрался сквозь ругань студии Добавлено через 2 минуты и 38 секунд:RuNTiME, о, спасибо ) Всё, ушёл разбираться и распутываться)
|
|
« Последнее редактирование: 09-09-2011 20:32 от Алексей1153 »
|
Записан
|
|
|
|
RXL
|
|
« Ответ #38 : 09-09-2011 20:32 » |
|
Леш, это Си.
extern "C" { .... }
Использовал?
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #41 : 09-09-2011 21:05 » |
|
ааа, это жесть не хуже разбора формата гифа )))
А у меня ещё и проект юникодный ))
|
|
|
Записан
|
|
|
|
RXL
|
|
« Ответ #42 : 09-09-2011 21:07 » |
|
Леш, да там заголовок на две страницы всего...
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #43 : 09-09-2011 21:21 » |
|
да что-то не получается так просто. Одно за другим сыплется - этого не хватает, того. Или я не то смотрю начинал с этого хидера - GifWin.h Добавлено через 4 минуты и 2 секунды:всё, я утонул в ошибках компиляции и прочей херне засыпаю, завтра продолжу
|
|
« Последнее редактирование: 09-09-2011 21:25 от Алексей1153 »
|
Записан
|
|
|
|
RuNTiME
|
|
« Ответ #44 : 10-09-2011 08:41 » |
|
Алексей1153++, Я написал небольшой примерчик, который создает C:\test.gif (черный квадрат 512x512) с использованием giflib. Проект для Visual Studio 2005 во вложении.
|
|
|
Записан
|
Любимая игрушка - debugger ...
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #45 : 10-09-2011 10:08 » |
|
RuNTiME, благодарю, только я сейчас вот из этого http://www.solidfluid.co.uk/sfsite.php/000000CF собираю рабочую версию, там вроде немного разобрался. Если опять не пойдёт, то твой вариант буду пытать ) Добавлено через 3 часа, 5 минут и 59 секунд:уряяя, есть сдвиг )) Заколебался, правда, адаптировать, но тест сразу удачный переделывать СИшную тряхомундию не буду, сейчас выясню, как он там сжимает данные , да себе этот кусочек кода перенесу А умеет ли он анимировать - я не знаю даже, не нашёл
|
|
« Последнее редактирование: 10-09-2011 13:14 от Алексей1153 »
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #46 : 10-09-2011 19:20 » |
|
прогресс налицо ) файлик сгенерирован программой ещё есть одна проблемка - начиная с определённого размера формат ломается - грешу на косяк в размещении субблоков кадра. Завтра поразбираюсь ) Всем огромное спасибо за пинки в нужном направлении Добавлено через 1 минуту и 44 секунды:хм, почему-то анимация останавливается в браузере. Сначала играет, а потом - тык В графпрограмме играет постоянно
|
1234.gif (2.67 Кб - загружено 1913 раз.)
|
« Последнее редактирование: 10-09-2011 19:21 от Алексей1153 »
|
Записан
|
|
|
|
RXL
|
|
« Ответ #47 : 10-09-2011 19:27 » |
|
Цикл включен? Насколько помню, анимация может быть однократной или циклической.
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #48 : 10-09-2011 19:39 » |
|
ещё тестик добавил модификатор Netscape Добавлено через 18 секунд:ага, нормуль ) Добавлено через 2 минуты и 34 секунды: однократной или циклической. судя по описанию, значение Loop 0 - бесконечно 1 - два раза 2 - тоже два раза 3 - 3 раза 4 - 4 раза ... 65535 - 65535 раз
|
1234.gif (2.69 Кб - загружено 2379 раз.)
|
« Последнее редактирование: 10-09-2011 19:42 от Алексей1153 »
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #49 : 10-09-2011 20:17 » |
|
|
1234.gif (37.32 Кб - загружено 1845 раз.)
|
|
Записан
|
|
|
|
RXL
|
|
« Ответ #50 : 10-09-2011 20:44 » |
|
Поздравляю! Так чем ты его осилил?
Кстати из фишек: кадры рендерятся поверх предыдущих - статические компоненты нужны только в первом кадре, а в остальных их можно заменить цветом прозрачности.
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #51 : 11-09-2011 00:42 » |
|
Так чем ты его осилил?
так вот этим ) http://www.solidfluid.co.uk/sfsite.php/000000CF и вот отличная очень подробная дока - там и про фишки эти написано, а как выбирать способ смены кадра, смещать кадр и так далее http://home.onego.ru/~chiezo/gif.htm Там же ссылка на алгоритм сжатия, но у меня по нему не вышло. Собственно, косяк только в нём у меня и был, всё остальное осталось без изменений, а сжатие я взял из первой ссылки (только пришлось попотеть, доставая необходимо минимальное для компиляции). Конечно, это всё костыль - как будет время, изучу алгоритм, который там зашит, да оставлю только его ---------- задание заказчика такое (самое сложное уже сделано ): Необходима dll, написанная на C++ с одной функцией: на входе получить ASCII-строку и номер шрифта, а на выходе отдать картинку в формате анимированного GIF, где на наждом кадре будет написана входая строка черным цветом и каждый белый пиксель кадра должен быть инвертирован случайным образом с вероятностью 10%. Всего кадров столько, сколько букв во входной строке.
|
|
|
Записан
|
|
|
|
Джон
просто
Администратор
Offline
Пол:
|
|
« Ответ #52 : 11-09-2011 07:20 » |
|
Лёш, короче генератор картинок для капчи ему нужен.
|
|
|
Записан
|
Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома. "Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash "Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman "All science is either physics or stamp collecting." Ernest Rutherford "Wer will, findet Wege, wer nicht will, findet Gründe."
|
|
|
RXL
|
|
« Ответ #53 : 11-09-2011 09:11 » |
|
Тогда рекомендую не рендерить все буквы в одном кадре - слишком легко будет убрать шум. А вообще, это примитивизм для OCR. Если уж делать интереснее, то лучше бы в анимации буквы "плавали" и к ним применялись бы различные анимационные эффекты.
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
Dimka
Деятель
Команда клуба
Offline
Пол:
|
|
« Ответ #54 : 11-09-2011 10:02 » |
|
RXL, что даст анимация в плане защиты от OCR? Достаточно либо взять кадр, либо последовательно сложить несколько кадров или перепробовать серию таких комбинаций, загоняя каждую в OCR.
|
|
|
Записан
|
Программировать - значит понимать (К. Нюгард) Невывернутое лучше, чем вправленное (М. Аврелий) Многие готовы скорее умереть, чем подумать (Б. Рассел)
|
|
|
RXL
|
|
« Ответ #55 : 11-09-2011 10:17 » |
|
Дим, тут играет роль особенность зрения: видео воспринимается глазом намного легче, чем статическая картинка. Т.е. имеем массу плюсов: степень искажения текста может быть больше, в каждом кадре может быть фрагмент целого изображения, элементы изображения могут двигаться. Возможно еще есть возможности затруднить декодирование.
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #56 : 11-09-2011 11:31 » |
|
Лёш, короче генератор картинок для капчи ему нужен. ну это само собой. Я ещё предлагаю ему опции по разбросу букв ) RXL, да, это всё в процессе доводки сделаем, если нужно будет. Совет я заку дам, а там он сам решит. Димка правильно говорит - лучше сделать для каждой литеры случайное смещение + небольшой поворот. Для глаза это будет читаемо, а вот распознавалка сдуется Добавлено через 8 минут и 43 секунды:кстати, любопытное наблюдение в процессе поиска истины: сначала я пытался всё сделать сам, активно применяя std::vector для массивов и std::map для индексации. В дебаге генерилось жутко долго,я даже расстроился (а то, что генерилось не то - это пока значения не имело, объём вычислений всё равно похожий), хотя резервирование для векторов я делал тщательно. Но запустил в релизе - работает моментально Оптимизатор, однако ) А сишный исходник (там нет STL, одни динамические массивы через alloc и free и куча хаков) - ну просто летает даже в дебаге ))) Хотя, там без бидона кефира лучше не соваться, я до знакомства с STL и то прозрачнее всё делал.
|
|
« Последнее редактирование: 11-09-2011 11:39 от Алексей1153 »
|
Записан
|
|
|
|
Sla
|
|
« Ответ #57 : 11-09-2011 12:05 » |
|
Offtopic: Если народ recaptcha ломает... то такую "простую" гифку не составит труда. Было бы это кому-то нужно.
Поставлю в угол.
|
|
|
Записан
|
Мы все учились понемногу... Чему-нибудь и как-нибудь.
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #58 : 11-09-2011 12:18 » |
|
Sla, заказчик сказал - фрилансер сделал, деньги получил
|
|
|
Записан
|
|
|
|
Finch
Спокойный
Администратор
Offline
Пол:
Пролетал мимо
|
|
« Ответ #59 : 11-09-2011 18:10 » |
|
кстати, любопытное наблюдение в процессе поиска истины:
сначала я пытался всё сделать сам, активно применяя std::vector для массивов и std::map для индексации. В дебаге генерилось жутко долго,я даже расстроился (а то, что генерилось не то - это пока значения не имело, объём вычислений всё равно похожий), хотя резервирование для векторов я делал тщательно. Но запустил в релизе - работает моментально
Оптимизатор, однако )
А сишный исходник (там нет STL, одни динамические массивы через alloc и free и куча хаков) - ну просто летает даже в дебаге ))) Хотя, там без бидона кефира лучше не соваться, я до знакомства с STL и то прозрачнее всё делал.
Алексей1153++, Это особенности студии GCC я например такого эффекта практически не наблюдаю. А в студии сталкивался. Внутри студийного кода в Debug режиме очень много ASSERT, выделений и зачистка памяти сверх запрошенного и так далее. И это все очень значительно жрет ресурсов.
|
|
|
Записан
|
Не будите спашяго дракона. Джаффар (Коша)
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #60 : 12-09-2011 03:52 » |
|
Finch, я думаю, что тут больше дело в оптимизации, в дебаге она отключена
кстати, ещё одно любопытное наблюдение - несколько раз порываюсь начать использовать GDI+ , но так ни разу он мне пользы не принёс )
Добавлено через 1 день, 11 часов, 40 минут и 45 секунд: уряя, добил и сдал )
|
|
« Последнее редактирование: 13-09-2011 16:21 от Алексей1153 »
|
Записан
|
|
|
|
RXL
|
|
« Ответ #61 : 13-09-2011 19:46 » |
|
Маладэц! Возмы с полкы дынамыт
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #62 : 14-09-2011 03:36 » |
|
а почему не пирожок ? )
|
|
|
Записан
|
|
|
|
|