Форум: "Media";
Текущий архив: 2005.08.14;
Скачать: [xml.tar.bz2];
ВнизОпределение разрешения картинок (jpg bmp gif) Найти похожие ветки
← →
DS (2005-04-06 14:34) [0]Кто знает как определить разрешение картинок без создания объектов в памяти (TJpegImag TBitmap)
← →
Nes © (2005-04-06 15:22) [1]Эм, ну попробуй чтоли определять разрешение с помощью
function ExtractFileExt(const FileName: string): string;
← →
Amoeba © (2005-04-06 16:23) [2]Что имеется в виду под разрешением? Высота и ширина наверное? Или что-то другое? Если о перевом, то надо знать формат этих файлов. В их заголовочных разделах записана такая информация.
> Nes © (06.04.05 15:22) [1]
> Эм, ну попробуй чтоли определять разрешение с помощью
> function ExtractFileExt(const FileName: string): string;
Подумай хорошенько, какую глупость сморозил. Речь ведь идет не о расширении а о разрешении.
← →
DS (2005-04-06 20:50) [3]Конечно о разрешении (Высота и ширина) ... про заголовки интересно . но как их прочитать ... хотябы для jpeg файла :)
← →
Gero © (2005-04-06 21:43) [4]Высота и ширина это не разрешение.
← →
Gero © (2005-04-06 21:44) [5]Читай заголовок файла и извлекай оттуда высоту и ширину.
← →
uny © (2005-04-07 09:44) [6]не на все картинки есть разрешение!
← →
wicked © (2005-04-07 12:37) [7]для 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;
.}
точки в начале строк убрать....
ЗЫ извините, что по иностранному... ;)
← →
wicked © (2005-04-07 12:40) [8]пояснения к коду, читающему JPEG - необходима библиотека IJG, скомпилировать её простым компилятором си, затем перевести необходимые типы и структуры на паскаль (не забывая о выравнивании членов структур) и прилинковать необходимые obj файлы директивой {$L}...
так, кстати, и сделана поддержка JPEG в TJPEGImage...
← →
wicked © (2005-04-07 12:41) [9]как более простой выход - поискать что то с готовым language binding для delphi.... например, глянуть на ImageMagick (просто совет, не знаю, будет ли он читать заголовки)...
← →
Магнитоныч (2005-04-07 23:09) [10]http://delphimaster.ru/cgi-bin/faq.pl?look=1&id=988625329&n=21
Это?
← →
DS (2005-04-08 00:23) [11]http://delphimaster.ru/cgi-bin/faq.pl?look=1&id=988625329&n=21
Отличная тема! то что надо .. спасибо огромное :)
Страницы: 1 вся ветка
Форум: "Media";
Текущий архив: 2005.08.14;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.013 c