Форум: "Media";
Текущий архив: 2005.06.14;
Скачать: [xml.tar.bz2];
Вниз*.TGA и Timage Найти похожие ветки
← →
seregka (2005-02-24 17:25) [0]Помогите, пожалуйста!
Нужно вставить *.tga и *.tiff файлы в Image, но их как изображение он не понимает.
что делать.
Конвертацию в jpg не предлагать, т.к. предстоит работа с большим количеством файлов
← →
Sphinx (2005-02-25 19:33) [1]{==============================================================
примечания: 1) работает только с несжатыми графическими данными
2) изображения должны иметь глубину цвета 24 или 32 бита на пиксель
3) не поддерживается прозрачность при загрузке в TBitmap
===============================================================}
unit uTtga;
interface
uses
Windows,
Classes,
Graphics,
SysUtils;
{==============================================================
структуры данных
==============================================================}
type
{ вспомогательные записи }
_array_char18 = array[0..17] of Char;
_array_char41 = array [0..40] of Char;
_array_char324 = array [0..323] of Char;
{ заголовок файла формата TGA }
_tga_header = packed record
IDLength : Byte; // длинна описательной части файла
ColorMapType : Byte; // тип палитры файла
ImageType : Byte; // тип хранимого изображения
ColorMapOffset : Word; // начальный бит палитры
ColorMapLength : Word; // длинна палитры
ColorMapDepth : Byte; // количество цветов в палитре
XOffset : Word; // смещение изображения по оси Х
YOffset : Word; // смещение изображения по оси У
Width : Word; // ширина изображения
Height : Word; // высота изображения
ColorDepth : Byte; // глубина цвета
Description : Byte; // маркер
end;
{===============================================================
заголовок файла идентичен для версий TGA v1.0 и TGA v2.0
основное отличае между версиями форматов - наличае в v2.0
дополнительных данных и несколько инная запись графических координат точек
для поля ColorMapType возможны следующие значения:
0 - палитра отсутствует;
1 - изображение хранит палитру;
инное - допускается, это означает что файл создан для каких-то
специализированных целей с применением собственного формата;
для поля ImageType возможны следующие значения:
0 - в файле не содержится графических данных;
1 - файл содержит изображение с палитрой
(ColorDepth при этом 4 или 8);
2 - файл содержит изображение без палитры
(ColorDepth при этом 24 или 32);
3 - файл содержит монохромное изображение;
9 - файл содержит изображение с палитрой (данные сжаты);
10 - файл содержит изображение без палитры (данные сжаты);
11 - файл содержит монохромное изображение (данные сжаты);
===============================================================}
{ "нижний заголовок" формата TGA v2.0 }
_tga_footer = packed record
ExtensionOffset : DWord; // смещение расширенного раздела
DeveloperOffset : DWord; // смещение раздела разработчиков
Signature : _array_char18; // описание формата
end;
{===============================================================
располагается в конце файла;
длинна блока данных 26 байт.
===============================================================}
{ данные разработчика формата TGA v2.0 }
_tga_tag = packed record
TagID : Word; // уникальный номер
DataOffset : DWord; // смещение области данных тэга
DataLength : DWord; // размер области данных тэга
end;
{===============================================================
уникальный номер может принимать значения от 0 до 32767
диапазон от 32768 до 65535 зарезервирован TreuVision для своих нужд;
длинна блока данных 10 байт.
===============================================================}
{ область расширенных данных формата TGA v2.0 }
_tga_extension = packed record
Length : Word; // размер расширенной области
AutorName : _array_char41; // имя автора
AutorComment : _array_char324; // авторский коментарий
StampMonth : Word; // месяц создания/модификации файла
StampDay : Word; // день создания/модификации файла
StampYear : Word; // год создания/модификации файла
StampHour : Word; // час создания/модификации файла
StampMinute : Word; // минута создания/модификации файла
StampSecond : Word; // секунда создания/модификации файла
JobName : _array_char41; // имя разработки для которой выполняется файл
JobHour : Word; // продолжительность работы в часах
JobMinute : Word; // продолжительность работы в минутах
JobSecond : Word; // продолжительность работы в секундах
SoftwareID : _array_char41; // программа-создатель
VersionNumber : Word; // версия программы-создателя
VersionLetter : Byte; // символ программы-создателя
KeyColor : Cardinal; // фоновый цвет изображения
PixelNumerator : Word; // числитель пикселей
PixelDenominator : Word; // знаменатель пикселей
GammaNumerator : Word; // числитель палитры
GammaDenominator : Word; // знаменатель палитры
ColorOffset : DWord; // смещение таблицы коррекции данных
StampOffset : DWord; // смещение до данных "почтовой марки"
ScanOffset : DWord; // смещение до данных "растровой строки"
AttributesType : Byte; // атрибуты изображения
end;
← →
Sphinx (2005-02-25 19:35) [2]{===============================================================
размер расширенной области должен быть равен 495 байтам;
фоновый цвет изображения - это цвет которым закрашивается подложка
пустого изображения, этот цвет используется для заливки прозрачных
участков изображения, по умолчанию устанавливается значение = 0
(что соответствует черному цвету);
PixelNumerator, PixelDenominator - содержат данные о степени сжатии
изображения, если изображение несжато - то оба значения = 0;
GammaNumerator, GammaDenominator - значения исправлений гаммы изображения,
если данные не содержат гамму, то оба значения = 0;
ColorOffset - таблица коррекции цветов, если в файле отсутствует
таблица коррекции цветов, то это значение = 0;
StampOffset - смещение до данных "почтовой марки", включенной в файл TGA v2.0
если "почтовая марка" в файле отсутствует - это значение = 0;
ScanOffset - смещение до данных "растровой стороки", если "растровая строка"
в файле отсутствует - это значение = 0;
AttributesType - указывают содержит ли изображение альфа канал, если поле
имеет значение 00h - то изображение не содержит альфа-канала,
значения 01h, 02h, 04h и 08h указывают на наличае альфа-канала;
в файле формата TGA v2.0 может присутствовать только одна дополнительная
структура (!) или "почтовая марка", или "растровая строка", или таблица
корректировки цветов;
Таблица растровой строки - метод обратиться к строкам развертки в любом
местоположении в пределах необработанных или сжатых данных изображения.
Таблица - массив значений DWORD. Каждое значение - местоположение
смещения с начала файла к началу соответствующей строки развертки
в данных изображения. Данные записаны в таблице в порядке,
в котором строки развертки появляются в изображении.
Изображение "почтовой марки" - меньшее исполнение первичного изображения,
сохраненное в пределах TGA файла. Первый байт данных "почтовой марки"
определяет ширину штампа в пикселах, и второй байт определяет высоту,
также в пикселах. "Почтовые марки" не должны быть большими
чем 64x64 пикселя, обычно сохраняются в том же самом формате что и
первичное изображение, и никогда не сжимаются.
Таблица коррекции цвета - массив 1000 байтов в длине, которая содержит
256 входов, имел обыкновение сохранять значения, используемые
для цветного переотображения.
===============================================================}
← →
Sphinx (2005-02-25 19:36) [3]{ формат данных таблицы коррекции цветов }
_tga_colorcorrectiontable = packed record
Alpha : Word;
Red : Word;
Green : Word;
Blue : Word;
end;
{ записи формата пикселя }
_bgra = packed record
B: Byte;
G: Byte;
R: Byte;
A: Byte;
end;
_bgr = packed record
B: Byte;
G: Byte;
R: Byte;
end;
TARGB = packed record
Alpha : Word;
Red : Word;
Green : Word;
Blue : Word;
end;
TRGB = packed record
Red : Word;
Green : Word;
Blue : Word;
end;
{ массивы под данные пикселей }
_bgra_array = array of array of _bgra;
_bgr_array = array of array of _bgr;
TARGBArray = array of array of TARGB;
TRGBArray = array of array of TRGB;
_dword_array = array of array of DWord;
{ записи содержащие графические данные }
TCustomBGRAPic = packed record
Width : Word;
Height : Word;
DATA : _bgra_array;
end;
TCustomBGRPic = packed record
Width : Word;
Height : Word;
DATA : _bgr_array;
end;
TCustomARGBPic = packed record
Width : Word;
Height : Word;
DATA : TARGBArray;
end;
TCustomRGBPic = packed record
Width : Word;
Height : Word;
DATA : TRGBArray;
end;
TCustomDWordPic = packed record
Width: Word;
Height: Word;
DATA: _dword_array;
end;
{==============================================================================
постоянные величины программы
==============================================================================}
const
{ коды ошибок выполнения процедур и функций }
ErrTTGANoError = 0; // ошибки отсутствуют
ErrTTGAFileNotFind = 1; // не найден файл с изображением
ErrTTGAInvalidFile = 2; // файл содержит неверное изображение
{ размер расширенной области данных }
_tga_extension_length = 495;
var
{ описание формата TGA v2.0 }
_true_footer: _array_char18 = ("T","R","U","E","V","I","S","I","O","N","-","X","F","I","L","E",".",#0);
{ функции экспортируемые из файла }
function ColorToBGRA (Color: TColor): _bgra; forward;
function ColorToBGR (Color: TColor): _bgr; forward;
function BGRAToColor (Color: _bgra): TColor; forward;
function BGRToColor (Color: _bgr): TColor; forward;
function BGRAToDWord (Color: _bgra): DWord; forward;
function BGRToDWord (Color: _bgr): DWord; forward;
function LoadTGAToBmp(FileName: String; DestBMP: TBitmap): Integer; forward;
function LoadTGAToCanvas(FileName: String; DestCanvas: TCanvas): Integer; forward;
function LoadTGAToArrayBGRA (FileName: String; out DestArray: TCustomBGRAPic): Integer; forward;
function LoadTGAToArrayDWORD (FileName: String; out DestArray: TCustomDWordPic): Integer; forward;
← →
Sphinx (2005-02-25 19:37) [4]implementation
{==============================================================================
преобразование типа TColor в структуру ARGB
==============================================================================}
function ColorToBGRA (Color: TColor): _bgra;
begin
Result.R := Color and $FF;
Result.G := (Color and $FF00) shr 8;
Result.B := (Color and $FF0000) shr 16;
Result.A := 255;
end;
{==============================================================================
преобразование типа TColor в структуру RGB
==============================================================================}
function ColorToBGR (Color: TColor): _bgr;
begin
Result.R := Color and $FF;
Result.G := (Color and $FF00) shr 8;
Result.B := (Color and $FF0000) shr 16;
end;
{==============================================================================
преобразование структуры ARGB в тип TColor
==============================================================================}
function BGRAToColor (Color: _bgra): TColor;
begin
Result := (Color.B shl 16) or (Color.G shl 8) or Color.R;
end;
{==============================================================================
преобразование структуры RGB в тип TColor
==============================================================================}
function BGRToColor (Color: _bgr): TColor;
begin
Result := (Color.B shl 16) or (Color.G shl 8) or Color.R;
end;
{==============================================================================
преобразование структуры ARGB в целочисленную величину
==============================================================================}
function BGRAToDWord (Color: _bgra): DWord;
begin
Result := (Color.A shl 24) or (Color.B shl 16) or (Color.G shl 8) or Color.R ;
end;
{==============================================================================
преобразование структуры RGB в целочисленную величину
==============================================================================}
function BGRToDWord (Color: _bgr): DWord;
begin
Result := (Color.B shl 16) or (Color.G shl 8) or Color.R ;
end;
{==============================================================================
загрузка графических данных из файла фомата .tga в переменную типа TBitmap
==============================================================================}
function LoadTGAToBmp(FileName: String; DestBMP: TBitmap): Integer;
var
TGA_Stream : TFileStream;
TGAHeader : _tga_header;
FWidth : Word;
FHeight : Word;
bgr : _bgr;
bgra : _bgra;
tga_footer : _tga_footer;
TGAVers : Byte;
CurrentPOS : Int64;
begin
{ проверка существования файла }
if not (FileExists(FileName))
then
begin
Result := ErrTTGAFileNotFind;
Exit;
end;
{ создание вспомогательных переменных }
TGA_Stream := TFileStream.Create (FileName, fmOpenRead, fmShareDenyWrite);
{ чтение заголовка файла }
TGA_Stream.Read(TGAHeader, SizeOf(TGAHeader));
{ проверка версии файла TGA }
CurrentPOS := TGA_Stream.Position;
TGA_Stream.Seek(TGA_Stream.Size - SizeOf (tga_footer), soFromBeginning);
TGA_Stream.Read(tga_footer, SizeOf (tga_footer));
TGA_Stream.Position := CurrentPOS;
if tga_footer.Signature = _true_footer
then
TGAVers := 2
else
TGAVers := 1;
{ проверка соответствия файла знакомому формату }
if (TGAHeader.ImageType <> 2) or
((TGAHeader.ColorDepth <> 24) and (TGAHeader.ColorDepth <> 32))
then
begin
Result := ErrTTGAInvalidFile;
TGA_Stream.Free;
Exit;
end;
{ установка размеров изображения }
DestBMP.Width := TGAHeader.Width;
DestBMP.Height := TGAHeader.Height;
{ перемещение на позицию данных }
TGA_Stream.Position := TGA_Stream.Position + TGAHeader.IDLength;
{ чтение графических данных }
for FHeight := 0 to TGAHeader.Height - 1 do
for FWidth := 0 to TGAHeader.Width -1 do
begin
if TGAHeader.ColorDepth = 24
then
begin
TGA_Stream.Read(bgr, SizeOf(bgr));
if TGAVers = 1
then
begin
DestBMP.Canvas.Pixels[FWidth, FHeight] := BGRToColor(bgr);
end
else
begin
DestBMP.Canvas.Pixels[FWidth, TGAHeader.Height - FHeight - 1] := BGRToColor(bgr);
end;
end
else
begin
TGA_Stream.Read(bgra, SizeOf (bgra));
if TGAVers = 1
then
begin
DestBMP.Canvas.Pixels[FWidth, FHeight] := BGRAToColor(bgra);
end
else
begin
DestBMP.Canvas.Pixels[FWidth, TGAHeader.Height - FHeight - 1] := BGRAToColor(bgra);
end;
end;
end;
{ очистка вспомогательных переменных }
TGA_Stream.Free;
Result := ErrTTGANoError;
end;
← →
Sphinx (2005-02-25 19:40) [5]Всё это самопально е много лишнего...сделано побыстрому на коленке под свои нужды...эх...не ужержусь ведь...скажу "РАЗГРЕБАЙ САМ ПОЖАЛУЙСТА" :)
а использовать примерно так:procedure TForm1.Button2Click(Sender: TObject);
var
BMP: TBitmap;
begin
if Edit1.Text <> ""
then
begin
BMP := TBitmap.Create;
LoadTGAToBmp(Edit1.Text, BMP);
Image1.Canvas.Rectangle(0, 0, Image1.Width, Image1.Height);
Image1.Picture.Bitmap := BMP;
Image1.Update;
BMP.Free;
end;
end;
← →
Sphinx (2005-02-26 16:20) [6]Ах да, забыл сказать...
данных для глубины цвета = 16 бит не нашел и поэтому не знаю как при этом хранятся данные в формате 5-6-5, 5-5-5-1, 1-5-5-5 или с палитрой не знаю...эксперементировать не хотелось, мне проще переконвертировать фотошопом в 24 бита.
Страницы: 1 вся ветка
Форум: "Media";
Текущий архив: 2005.06.14;
Скачать: [xml.tar.bz2];
Память: 0.51 MB
Время: 0.039 c