C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Перевод сжатой графики в BMP, Есть ли такая компонента?
Mic
Отправлено: 24.05.2003, 15:37


Не зарегистрирован







Существует ли компонента или алгоритм перевода графического файла tiff, jpg, gif и т. д. в формат BMP?
На языке Java есть функция Grabber(), есть ли что то аналогичное на СИ++?
Admin
Отправлено: 24.05.2003, 16:18


Владимир

Группа: Администратор
Сообщений: 1190



Самое простое — использовать компонент Image:

CODE

void __fastcall TForm1::Button1Click(TObject *Sender)
{
       Image1->Picture->LoadFromFile("c:\\MyPicture.gif");
       Image1->Picture->SaveToFile("c:\\MyPicture.bmp");
}

Но с форматом tif так вряд-ли получится
----

Компоненты преобразования графических форматов смотри тут:
http://torry.torry.net/conversion.htm


----
Очень хорошие компоненты, работающие с форматом tif — LeadTools
Grigoriy
Отправлено: 11.03.2006, 05:43


Мастер участка

Группа: Участник
Сообщений: 381





Конвентор jpeg формата.
Я скачал с сайта http://www.wotsit.org.

Там много документов по форматам файлов.
Только на английском языке.

User Attached Image Скачать файл
jpeg.zip


MarcusCaesar
Отправлено: 22.03.2006, 23:16


Не зарегистрирован







Как вариант, предлагаю использовать библиотеку GDI+
У нее имеется отличный класс Bitmap, позволяющий, помимо всего прочего, загружать и сохранять изображения разных форматов (BMP, JPG, TIF, GIF и PNG) с любым направлением загрузка->сохранение.
Подробности см. на сайте RSDN Часть2. Работа с растрами и графическими файлами
Grigoriy
Отправлено: 15.04.2006, 20:04


Мастер участка

Группа: Участник
Сообщений: 381



QUOTE (MarcusCaesar @ 22/03/2006, 23:16)
Как вариант, предлагаю использовать библиотеку GDI+

ЗДРАВСТВУЙ, ФОРУМ !

Как мне было вас жалко.
Как вас давно не было в интернете !
Идите все сюда.
Форум снова работает.

Да. Я изучаю библиотеку GDI+.
Но изучаю ее особо...
Дело в том, что я пытаюсь до конца разобраться с тем как использовать её функции напрямую.
Мне это удается.
Но часто возникают ошибки, которые я потом понимаю и думаю
"Ах да ! Так, я же ошибся..."
Я понимаю мнение тех, кто считает, что через классы легче работать с этой библиотекой, но я буду пытаться с ней взаимодействовать на АССЕМБЛЕРЕ FASM. И напишу на FASM маленькую DLL, которая мне особо нужна и должна она быть именно маленькой, а делать то что нужно.

И ещё, мне непонравилось одна особенность этой библиотеки.
При сохранении изображения bitmap в файл при использовании Энкодера BMP нельзя повлиять на формат сохраняемого BMP-файла.
То бишь, если bitmap был изначально порожден от файла, в котором изображение кодировалось в формате пиксела
PixelFormat8bppIndexed
то когда это изображение сохраняется в BMP-файл, то BMP-файл может быть только 8-битным, хотя при вызове подпрограммы сохранения этой библиотеки один из параметров хранит адрес структуры с режимами сохранения. Я напишу
CODE

GdipSaveImageToFile(GpImage *image, GDIPCONST WCHAR* filename,
                   GDIPCONST CLSID* clsidEncoder,
                   GDIPCONST EncoderParameters* encoderParams);

class EncoderParameters
{
public:
   UINT Count;                      // Number of parameters in this structure
   EncoderParameter Parameter[1];   // Parameter values
};
class EncoderParameter
{
public:
   GUID    Guid;               // GUID of the parameter
   ULONG   NumberOfValues;     // Number of the parameter values
   ULONG   Type;               // Value type, like ValueTypeLONG etc.
   VOID*   Value;              // A pointer to the parameter values
};
Guid принимает одно из значений
DEFINE_GUID(EncoderCompression, 0xe09d739d,0xccd4,0x44ee,0x8e,0xba,0x3f,0xbf,0x8b,0xe4,0xfc,0x58);
DEFINE_GUID(EncoderColorDepth, 0x66087055,0xad66,0x4c7c,0x9a,0x18,0x38,0xa2,0x31,0x0b,0x83,0x37);
DEFINE_GUID(EncoderScanMethod, 0x3a4e2661,0x3109,0x4e56,0x85,0x36,0x42,0xc1,0x56,0xe7,0xdc,0xfa);
DEFINE_GUID(EncoderVersion, 0x24d18c76,0x814a,0x41a4,0xbf,0x53,0x1c,0x21,0x9c,0xcc,0xf7,0x97);
DEFINE_GUID(EncoderRenderMethod, 0x6d42c53a,0x229a,0x4825,0x8b,0xb7,0x5c,0x99,0xe2,0xb9,0xa8,0xb8);
DEFINE_GUID(EncoderQuality, 0x1d5be4b5,0xfa4a,0x452d,0x9c,0xdd,0x5d,0xb3,0x51,0x05,0xe7,0xeb);
DEFINE_GUID(EncoderTransformation,0x8d0eb2d1,0xa58e,0x4ea8,0xaa,0x14,0x10,0x80,0x74,0xb7,0xb6,0xf9);
DEFINE_GUID(EncoderLuminanceTable,0xedb33bce,0x0266,0x4a77,0xb9,0x04,0x27,0x21,0x60,0x99,0xe7,0x17);
DEFINE_GUID(EncoderChrominanceTable,0xf2e455dc,0x09b3,0x4316,0x82,0x60,0x67,0x6a,0xda,0x32,0x48,0x1c);
DEFINE_GUID(EncoderSaveFlag,0x292266fc,0xac40,0x47bf,0x8c, 0xfc, 0xa8, 0x5b, 0x89, 0xa6, 0x55, 0xde);
DEFINE_GUID(CodecIImageBytes,0x025d1823,0x6c7d,0x447b,0xbb, 0xdb, 0xa3, 0xcb, 0xc3, 0xdf, 0xa2, 0xfc);

ячейка памяти по адресу
GDIPCONST CLSID* clsidEncoder
принимает одно из значений

DEFINE_GUID(ImageFormatBMP, 0x557cf400,0x1a04,0x11d3,0x9a,0x73,0x00,0x00,0xf8,0x1e,0xf3,0x2e);
DEFINE_GUID(ImageFormatJPEG, 0x557cf401,0x1a04,0x11d3,0x9a,0x73,0x00,0x00,0xf8,0x1e,0xf3,0x2e);
DEFINE_GUID(ImageFormatPNG, 0x557cf406,0x1a04,0x11d3,0x9a,0x73,0x00,0x00,0xf8,0x1e,0xf3,0x2e);
DEFINE_GUID(ImageFormatGIF, 0x557cf402,0x1a04,0x11d3,0x9a,0x73,0x00,0x00,0xf8,0x1e,0xf3,0x2e);
DEFINE_GUID(ImageFormatTIFF, 0x557cf405,0x1a04,0x11d3,0x9a,0x73,0x00,0x00,0xf8,0x1e,0xf3,0x2e);



Но при сохранении в формате JPEG влияют только параметры сохранения
Трансформация 13 14 15 16 17
Квалитет (0...100)

И при сохранении в формате TIFF влияют только
метод компресии 2 3 5 4 6
количество бит на пиксел 1 4 8 24 32

А во всех остальных форматах и все остальные параметры не влияют.

Вернуться в Вопросы программирования в C++Builder