|
Исходники
Статьи
Языки программирования
.NET Delphi Visual C++ Borland C++ Builder C/С++ и C# Базы Данных MySQL MSSQL Oracle PostgreSQL Interbase VisualFoxPro Веб-Мастеру PHP HTML Perl Java JavaScript Протоколы AJAX Технология Ajax Освоение Ajax Сети Беспроводные сети Локальные сети Сети хранения данных TCP/IP xDSL ATM Операционные системы Windows Linux Wap Книги и учебники
Скрипты
Магазин программиста
|
Ishodniki.Ru » Online книги » C++ Builder по шагам Шаг 50 - Пример использования TFileStream. Этот пример иллюстрирует возможность создания формата (полностью демонстрационного) для хранения изображений. В общем-то являясь уступающим аналогом DIB (по нашему - BMP), тем не менее я думаю это хороший пример. Некоторая оговорка. Я не говорю, что TFileStream вообще и в данном случае - наилучший вариант поточного io класса. Например, можно было использовать fstream [basic_fstream]. Но все-таки это раздел, посвященный VCL и всему, что с ним связано. Поскольку программист на C++ Builder часто использует компонентные классы VCL, то ему приходится обращаться к сооствествующим поточным классам (потомкам TStream). Алгоритм просто перписывает информацию в файл с указанием ширины и высоты изображения. Вообще-то это неэффективное использование массива Pixels и свойства ScanLine. В реальной программе для этого бы использовались функции WinAPI для прямой работы с матрицей, типа GetDIBits и SetDIBits. Но при использовании этих функций пример бы потерял выразительность. Я использовал некоторые возможности программы ScrollView для просмотра изображений. Вот форма приложения:
Для более удобного отображения здесь
использован компонент TPageControl Для оперделения скорости процесса
конвертирования еще использован
компонент TProgressBar Так вот. TProgressBar - это индикатор. Обычно его используют в процессах, продолжающихся длительное время. Вкратце. Свойства Min и Max определяют минимальную и максимальную позиции индикатора. Свойство Position текущую позицию индикатора. Свойство Step сдвиг в позиции пл вызову метода StepIt. Вот код: //Эту функцию мне пришлось использовать из-за
// несовместимости формата DIB пикселей
// с выдаваемыми свойством Pixels
//Она переставляет R и B части цвета и удаляет высший байт..
long ConvertCol(long col)
{
col&=0x00FFFFFF;
long bcol=col;
bcol&=0x0000FF;
bcol*=0x10000;
long rcol=col;
rcol&=0xFF0000;
rcol/=0x10000;
long gcol=col;
gcol&=0x00FF00;
TColor result=(TColor)(rcol|gcol|bcol);
return result;
};
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::SaveClick(TObject *Sender)
{
TFileStream* fs=new TFileStream("test.xgr",fmCreate);
TVclBmp* bmp=new TVclBmp;
TColor *row;
TColor ptr;
int iptr;
int ns=sizeof(TColor);
bmp->Width=Image1->Picture->Bitmap->Width;
bmp->Height=Image1->Picture->Bitmap->Height;
TRect rect(0,0,Image1->Width,Image1->Height);
bmp->Canvas->CopyRect(rect,Image1->Picture->Bitmap->Canvas,rect);
iptr=bmp->Width;
fs->Write(&iptr,ns);
iptr=bmp->Height;
fs->Write(&iptr,ns);
Bar->Position=0;
Bar->Max=bmp->Height;
for(int i=0;i
Вот так вот. |
Форум Программиста
Новости
Обзоры
Магазин Программиста
Каталог ссылок
Поиск
Добавить файл
Обратная связь |