Исходники
Статьи
Языки программирования
.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 Вот так вот. |
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Рейтинги
|