Войти
ПрограммированиеФорумОбщее

Работа с файлами форматов ZIP, JPEG и PNG. (Комментарии к статье) (2 стр)

Страницы: 1 2 3 Следующая »
#15
21:47, 19 сен. 2004

Касимов Антон
Да. Тут ошибка. Маху дал, исправляюсь :)
Да, если что-то не понятно, то можно посмотреть пример, там ессно все в рабочем состоянии.

---------------------------------------------------------------------------------------------------------------------------

И так, после проверки сигнатуры и создания структур, вставляем такие строчки:

// настраиваем библиотеку на наш способ чтения файла
// указатель на file можно будет получить потом в PNGReadFunction
png_set_read_fn(png_ptr, (void*)&file, PNGReadFunction);
Теперь библиотека для чтения данных будет пользоваться указанной выше функцией. Немножко по параметрам:
второй - указатель на поток данных, т.е. именно его будет возвращать функция png_get_io_ptr;
третий - сама функция чтения данных и она должна быть следующего вида:
    void user_read_data(png_structp png_ptr, png_bytep data, png_size_t length);

ЗЫ: Стоит заметить, что заменить можно не только функцию чтения, но и функцию записи данных при помощи
png_set_write_fn. Если же работаете со стандартным потоком, то вместо этих двух функций можно вызвать одну -
png_init_io, она все сделает сама.


#16
21:49, 19 сен. 2004

И еще, советую всем заменить библиотеку на новую версию - 1.2.7. В ней исправлены серьезные недочеты по безопасности. Доп. информацию смотрите здесь: http://www.libpng.org/pub/png/libpng.html

#17
10:15, 1 окт. 2004

deni
А как работать с криптованными зипами? Я вообще не вижу толку от просто зипов. Помоему главный смысл закрыть доступ к ресурсам для игрока. А зип только увеличит общий размер дистрибутива, так как рар сожмет незапакованные ресурсы намного лучше.

#18
13:06, 1 окт. 2004

butcherrr
Я рассказывал о старой версии unzip'а. В нем небыло такой возможности, но сейчас в версии 1.2.1 появилась. Смотри в сторону ф-ции:
unzOpenCurrentFilePassword вместо указанной в статье unzOpenCurrentFile.

На счет толка от зипов. Мы допустим их используем, чтобы небыло тучи файлов с данными, ну и скрыть их (более/менее) от неопытных пользователей. Просто чтобы не изменили что-либо по дури. Паковать с паролем глупо, ИМХО, если будет надо то вскроют. И еще, зипом мы не сжимаем, зипом мы объединяем файлы в один без компрессии.

#19
13:30, 1 окт. 2004

deni
>Смотри в сторону ф-ции: unzOpenCurrentFilePassword
ок
>Паковать с паролем глупо, ИМХО, если будет надо то вскроют
Неужели так легко сломать? Даже если будет очень длинный пароль?
>И еще, зипом мы не сжимаем, зипом мы объединяем файлы в один без компрессии.
Да, это выход.

Возможно ты прав. Можно оставить данные открытыми, а в игре проверять их контрольную сумму чтобы ресурсы не подменяли.

#20
17:46, 1 окт. 2004

deni
Почему для ловли ошибок при чтении png файла не вызывается setjmp? Это ведь очень серьёзный просчёт, при, допустим, испорченном png файле у тебя вылетит весь проект.

#21
22:18, 1 окт. 2004

Касимов Антон
>Почему для ловли ошибок при чтении png файла не вызывается setjmp? Это ведь
>очень серьёзный просчёт, при, допустим, испорченном png файле у тебя вылетит
>весь проект.
Наверное потому, что я не могу все предусмотреть :) О том, как настроить
setjmp/longjmp подробно написано в главе про чтение JPEG файлов. Из нее и
документации к библиотеки, можно спокойно построить свой алгоритм обработки
ошибок. Могу еще посоветовать почитать главу "Customizing libpng" в документации
(libpng.txt), в частности раздел "Memory allocation, input/output, and error handling".
Статья все-таки расчитана на начинающих разработчиков, для обсуждения более
глубоких проблем/тонких моментов есть форум, в котором я всегда рад помочь :)

Прошло более 1 года
#22
13:49, 14 мая 2006

Мужики , мож кто знает, скажите плз почему линкер не может найти эти объявления, когда юзаю libjpeg.lib

jpeg.obj : error LNK2019: unresolved external symbol "unsigned char __cdecl jpeg_resync_to_restart(struct jpeg_decompress_struct *,int)" (?jpeg_resync_to_restart@@YAEPAUjpeg_decompress_struct@@H@Z) referenced in function "void __cdecl JPEGStdioSrc(struct jpeg_decompress_struct *,class cFile *)" (?JPEGStdioSrc@@YAXPAUjpeg_decompress_struct@@PAVcFile@@@Z)

jpeg.obj : error LNK2019: unresolved external symbol "unsigned char __cdecl jpeg_finish_decompress(struct jpeg_decompress_struct *)" (?jpeg_finish_decompress@@YAEPAUjpeg_decompress_struct@@@Z) referenced in function "protected: int __thiscall cDataManager::ReadJPEG(struct cDataManager::cImage *,char const *,char const *)" (?ReadJPEG@cDataManager@@IAEHPAUcImage@1@PBD1@Z)
j
....

#23
16:18, 14 мая 2006

Barbar1an

потому что твоя прога на c++.
extern "C" {
#include <jpeglib.h>
#include <jerror.h>
}

#24
19:23, 14 мая 2006

waker
>Barbar1an
>потому что твоя прога на c++.
>extern "C" {
>#include <jpeglib.h>
>#include <jerror.h>
>}
Помогло, спасибо :)

Прошло более 1 года
#25
15:25, 16 июля 2007

народ, а где взять эту самую библиотеку unzip? по ссылке из статьи есть тока сорцы, которые в либу не собираются((

#26
21:32, 17 июля 2007

Информация к размышлению (интересные факты):

"Из-за юридических проблем, блокирующих использование GIF, именно формат PNG следует ныне использовать вместо GIF в тех приложениях, где формат JPG - неподходящая альтернатива..."

"Когда компания Unisys начала требовать от пользователей GIF плату за лицензии, использование GIF во многих случаях стало невозможным, особенно для свободно (бесплатно) распространяемого ПО..."

"Метод LZW, представляющий одну из разновидностей метода LZ78, был описан в статье Терри Велша из компании Sperry (ныне Unisys) в 1984. Компания Compuserve вскоре применила этот метод для сжатия изображений в формате GIF"
"Формат PNG превосходит GIF во всех отношениях, кроме одного: поддержки анимации..."

"До того, как компания Unisys стала требовать лицензии на использование метода LZW в ПО, область применения LZW не ограничивалась форматом GIF. Сжатие LZW также использовалось во многих типах программ сжатия, включая программу compress (из Unix). Когда метод LZW стало невозможно использовать в бесплатном ПО, его заменили библиотекой ZLIB. Библиотека ZLIB использует основанный на LZ77 метод сжатия, называемый Deflate, происхождение которого связано с программами ZIP и PKZIP. Именно библиотека ZLIB и используется в формате PNG..."

"Метод кодирования Хаффмана, используемый в формате PNG со сжатием Deflate, почти идентичен методу, применяемому в формате JPEG."


Источник: Миано Дж. "Форматы и алгоритмы сжатия изображений в действии" (2003) Издательство "Триумф", М.

Прошло более 6 месяцев
#27
16:52, 23 янв. 2008

Недавно попытался заюзать библиотеку, столкнулся с неприятным глюком. Когда читаю сканлайны в цикле, получаю полнейшую ересь. Один канал (предположительно синий) получаю корректный, остальные - какой-то бред, хотя и похожий на оригинал, но явно не то. Вот иллюстрации для пояснения. Первая - полученное изображение, еще три - каналы.

bred | Работа с файлами форматов ZIP, JPEG и PNG. (Комментарии к статье) = bred-red | Работа с файлами форматов ZIP, JPEG и PNG. (Комментарии к статье) + bred-green | Работа с файлами форматов ZIP, JPEG и PNG. (Комментарии к статье) + bred-blue | Работа с файлами форматов ZIP, JPEG и PNG. (Комментарии к статье)

По поводу кода - код взят из тутора ijg и добавлены куски для обработки палитровых картинок из текстурной библиотеки Борескова.

pixel* load_jpeg(const char* file_name,int* width,int* height) {
  struct jpeg_decompress_struct info;
  struct jpeg_error error;
  FILE* file;
  int rowspan,shift,i,y;
  pixel palette[256];
  pixel* result;
  unsigned char* ptr;
  JSAMPARRAY buffer;

  if((file=fopen(file_name,"rb"))==NULL) {
    return NULL;
  }

  info.err=jpeg_std_error(&error.pub);
  error.pub.error_exit=error_handler;

  if(setjmp(error.set_jmpbuffer)) {
    jpeg_destroy_decompress(&info);
    fclose(file);
    return NULL;
  }
  jpeg_create_decompress(&info);
  jpeg_stdio_src(&info,file);
  jpeg_read_header(&info,TRUE);

  if(info.jpeg_color_space!=JCS_GRAYSCALE)
    info.jpeg_color_space=JCS_RGB;

  jpeg_calc_output_dimensions(&info);

  *width=info.output_width;
  *height=info.output_height;
  rowspan=(*width)*info.num_components;
  buffer=(*info.mem->alloc_sarray)((j_common_ptr)&info,JPOOL_IMAGE,rowspan,1);

  jpeg_start_decompress(&info);

  result=(pixel*)malloc((*width)*(*height)*sizeof(pixel));

  if(info.quantize_colors) {
    shift=8-info.data_precision;
    if(info.jpeg_color_space!=JCS_GRAYSCALE) {
      for(i=0;i<info.actual_number_of_colors;++i)
        palette[i]=rgb(info.colormap[0][i]<<shift,info.colormap[1][i]<<shift,info.colormap[2][i]<<shift);
    } else {
      for(i=0;i<info.actual_number_of_colors;++i)
        palette[i]=rgb(info.colormap[0][i]<<shift,info.colormap[0][i]<<shift,info.colormap[0][i]<<shift);
    }
  }

  y=0;
  while(info.output_scanline<info.output_height) {
    jpeg_read_scanlines(&info,buffer,1);
    ptr=buffer[0];
    if(info.output_components==1) {
      if(info.quantize_colors) {
        for(i=0;i<(*width);++i)
          result[i+y*(*width)]=palette[ptr[i]];
      } else {
        for(i=0;i<(*width);++i)
          result[i+y*(*width)]=rgb(ptr[i],ptr[i],ptr[i]);
      }
    } else {
/*      memcpy(result+y*(*width),ptr,rowspan);*/
      for(i=0;i<(*width);++i,ptr+=3)
        result[i+y*(*width)]=rgb(ptr[2],ptr[1],ptr[0]);
    }
    ++y;
  }

  jpeg_finish_decompress(&info);
  jpeg_destroy_decompress(&info);

  fclose(file);

  return result;
}

Если у кого-то такое было, или я просто сделал где-то дурацкую ошибку, напишите, пожалуйста.

Прошло более 1 года
#28
23:09, 20 сен. 2009

люди, чета не пойму, читаю пнг, они кверх нагами, убераю перетасовку указателей, видно нормально оО

    // сопоставляем массив указателей на строчки, с выделенными в памяти (res)
    // т.к. изображение перевернутое, то указатели идут снизу вверх
    for (unsigned int i = 0; i < height; i++)
      row_pointers = data + i * row_bytes;
      //row_pointers[height - i - 1] = data + i * row_bytes;


вот мой рабочий вариант, могут быть текстуры пнг, где уже перевернуто изображение?

Прошло более 1 года
#29
18:40, 17 авг. 2011

Пример из статьи не конвертируется в vs2005, а при попытке собрать проект самому, пишет кучу ошибок типа "redefinition" в zlib.h (которую подключает unzip.h).
(Это для примера чтения png.)
У кого-нибудь есть компилящийся код из этой статьи?

Страницы: 1 2 3 Следующая »
ПрограммированиеФорумОбщее

Тема в архиве.