Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Определение разрешения картинок (jpg bmp gif) [D7, WinXP]


DS ©   (2005-04-06 14:34:00) 

Кто знает как определить разрешение картинок без создания объектов в памяти (TJpegImag TBitmap)


DS   (2005-04-08 00:23:00) [1]

http://delphimaster.ru/cgi-bin/faq.pl?look=1&id=988625329&n=21
Отличная тема! то что надо .. спасибо огромное :)


Магнитоныч   (2005-04-07 23:09:00) [2]

http://delphimaster.ru/cgi-bin/faq.pl?look=1&id=988625329&n=21
Это?


wicked   (2005-04-07 12:41:00) [3]

как более простой выход - поискать что то с готовым language binding для delphi.... например, глянуть на ImageMagick (просто совет, не знаю, будет ли он читать заголовки)...


wicked   (2005-04-07 12:40:00) [4]

пояснения к коду, читающему JPEG - необходима библиотека IJG, скомпилировать её простым компилятором си, затем перевести необходимые типы и структуры на паскаль (не забывая о выравнивании членов структур) и прилинковать необходимые obj файлы директивой {$L}...
так, кстати, и сделана поддержка JPEG в TJPEGImage...


wicked   (2005-04-07 12:37:00) [5]

для BMP:
.bool __fastcall GetDIBDim(void * srcdata, int * width, int * height)
.{
. LPBITMAPINFO bi = (LPBITMAPINFO)((LPBYTE)srcdata + sizeof(BITMAPFILEHEADER));
. bool result = ((char *)srcdata)[0] == 'B' && ((char *)srcdata)[1] == 'M';
. if(result){
.  if(width)
.   *width = bi->bmiHeader.biWidth;
.  if(height)
.   *height = bi->bmiHeader.biHeight;
. }
. return result;
.}

для JPEG:
.bool __fastcall JPEGReadDim(TMemoryStream * data, int &w, int &h)
.{
. bool result = true;
.
. jpeg_decompress_struct srcinfo;
. jpeg_error_mgr jerr;
.
. srcinfo.err = errBind(&jerr);
. jpeg_create_decompress(&srcinfo);
. try {
.  try {
.   data->Position = 0;
.   jiBind(&srcinfo, data);
.
.   jpeg_read_header(&srcinfo, FALSE);
.
.   w = srcinfo.image_width;
.   h = srcinfo.image_height;
.  } __finally {
.   jpeg_destroy_decompress(&srcinfo);
.  }
. } catch(...) {
.  result = false;
. }
. return result;
.}
.
.#define buf_size 4096
.
.//---------------------------------------------------------------------------
.typedef struct tagJPEGInput {
. struct jpeg_source_mgr pub;
. TCustomMemoryStream * data;
.} JPEGInput;
.
.// JPEG input
.
.METHODDEF(void) jiInitSource(j_decompress_ptr cinfo)
.{
. JPEGInput * src = (JPEGInput *) cinfo->src;
. if(src->data) src->data->Position = 0;
.}
.
.static JOCTET eof_buffer[2] = { 0xff, JPEG_EOI };
.
.METHODDEF(boolean) jiRead(j_decompress_ptr cinfo)
.{
. JPEGInput * src = (JPEGInput *) cinfo->src;
. if(src->data && src->data->Position < src->data->Size){
.  src->pub.next_input_byte = (JOCTET *) ((char *)src->data->Memory + (int)src->data->Position);
.  int rest_size = src->data->Size - src->data->Position;
.  if(rest_size > buf_size){
.   src->pub.bytes_in_buffer = buf_size;
.   src->data->Position += buf_size;
.  } else {
.   src->pub.bytes_in_buffer = rest_size;
.   src->data->Seek(0, soFromEnd);
.  }
. } else {
.  src->pub.next_input_byte = eof_buffer; // substitute fake JPEG eof MARKER
.  src->pub.bytes_in_buffer = 2;
. }
. return TRUE;
.}
.
.METHODDEF(void) jiSkip(j_decompress_ptr cinfo, long num_bytes)
.{
. JPEGInput * src = (JPEGInput *) cinfo->src;
. num_bytes -= src->pub.bytes_in_buffer;
. if(num_bytes > 0 && src->data){
.  int rest_size = src->data->Size - (src->data->Position + num_bytes);
.  if(rest_size > 0){
.   src->data->Position += num_bytes;
.   src->pub.next_input_byte = (JOCTET *) ((char *)src->data->Memory + (int)src->data->Position);
.
.   rest_size = src->data->Size - src->data->Position;
.   if(rest_size > buf_size){
.    src->pub.bytes_in_buffer = buf_size;
.    src->data->Position += buf_size;
.   } else {
.    src->pub.bytes_in_buffer = rest_size;
.    src->data->Seek(0, soFromEnd);
.   }
.  } else {
.   src->pub.next_input_byte = eof_buffer; // substitute fake JPEG eof MARKER
.   src->pub.bytes_in_buffer = 2;
.  }
. }
.
.}
.
.METHODDEF(void) jiTerminate(j_decompress_ptr cinfo)
.{
.// none
.}
.
.GLOBAL(void) jiBind(j_decompress_ptr cinfo, TCustomMemoryStream * aData)
.{
. JPEGInput * src = NULL;
. if(cinfo->src == NULL) {
.  cinfo->src = (jpeg_source_mgr *)(*cinfo->mem->alloc_small)((j_common_ptr) cinfo,
.   JPOOL_PERMANENT,
.   SIZEOF(JPEGInput));
.  memset(cinfo->src, 0, SIZEOF(JPEGInput));
. }
. src = (JPEGInput *) cinfo->src;
. src->pub.init_source = jiInitSource;
. src->pub.fill_input_buffer = jiRead;
. src->pub.skip_input_data = jiSkip;
. src->pub.resync_to_restart = jpeg_resync_to_restart; /* use default method */
. src->pub.term_source = jiTerminate;
. src->data = aData;
. src->data->Position = 0;
. src->pub.bytes_in_buffer = 0;
. src->pub.next_input_byte = NULL;
.}

точки в начале строк убрать....
ЗЫ извините, что по иностранному... ;)


uny   (2005-04-07 09:44:00) [6]

не на все картинки есть разрешение!


Gero   (2005-04-06 21:44:00) [7]

Читай заголовок файла и извлекай оттуда высоту и ширину.


Gero   (2005-04-06 21:43:00) [8]

Высота и ширина это не разрешение.


DS   (2005-04-06 20:50:00) [9]

Конечно о разрешении(Высота и ширина) ... про заголовки интересно . но как их прочитать ... хотябы для jpeg файла :)


Amoeba   (2005-04-06 16:23:00) [10]

Что имеется в виду под разрешением? Высота и ширина наверное? Или что-то другое? Если о перевом, то надо знать формат этих файлов. В их заголовочных разделах записана такая информация.


> Nes ©   (06.04.05 15:22) [1]
> Эм, ну попробуй чтоли определять разрешение с помощью
> function ExtractFileExt(const FileName: string): string;

Подумай хорошенько, какую глупость сморозил. Речь ведь идет не о расширенииа о разрешении.


Nes   (2005-04-06 15:22:00) [11]

Эм, ну попробуй чтоли определять разрешение с помощью
function ExtractFileExt(const FileName: string): string;


Наверх

Титульная страница Поиск, карта сайта Написать письмо