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

 
Как вывести изображение на TImage?, Имея только массив char*
Aptem
Отправлено: 08.02.2006, 20:21


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

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



Здравствуйте.

Есть массив char* в который загружен bmp-файл, как вывести этот файл на TImage именно с массива? Чувствую, что это просто, но никак не могу догнать.

Спасибо за внимание.
vitavita
Отправлено: 08.02.2006, 21:29


Дежурный стрелочник

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



CODE

Graphics::TBitmap *Im= new Graphics::TBitmap();
Im->PixelFormat =pf24bit;
int jd=3;// для 24bit
BYTE * LINE=new BYTE[jd*W]
char ima[H][W];

for(int i=0; i<H; i++)
{
LINE = (BYTE *) Im-> ScanLine[i]; // идет присваивание указ. строки !

for(int j=0; j<W; j++){ int j3=j*jd;
LINE[j3]=LINE[j3+1]= LINE[j3+2]=ima[i][j];
}
}


Что-то типа этого для 24bit изображения

Отредактировано vitavita — 09/02/2006, 10:37
Aptem
Отправлено: 09.02.2006, 09:20


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

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



Так ведь таким образом мы ничего не присваеваем TBitmap'у. Какже тогда это изображение отобразиться? Не очень понял... sad.gif
AVC
Отправлено: 09.02.2006, 09:53


Ветеран

Группа: Модератор
Сообщений: 1583



>Есть массив char* в который загружен bmp-файл
Посмотрите в сторону LoadFromStream
Aptem
Отправлено: 09.02.2006, 11:06


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

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



QUOTE (AVC @ 09/02/2006, 09:53)
Посмотрите в сторону LoadFromStream

Именно первой мыслью и было использование LoadFromStream, но к сожалению ни разу с ним не сталкивался и не очень понимаю как его применить.
Guest
Отправлено: 09.02.2006, 12:03


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







Aptem
Я предложил быстрый вариант и он работает. Советую все-таки подумать над ним
Вариант с LoadFromStream потребует от Вас знаний заголовка формата bmp , да и вообще формата bmp. Если Вы этого хотите — Бог в помощь
vitavita
Отправлено: 09.02.2006, 12:04


Дежурный стрелочник

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



Предыдущее сообщение мое — не авторизовалось wink.gif
avc*
Отправлено: 09.02.2006, 12:10


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







QUOTE

Вариант с LoadFromStream потребует от Вас знаний заголовка формата bmp , да и вообще формата bmp.

Зачем?
Постановка задачи — Есть массив char* в который загружен bmp-файл
Помните?
Aptem
Отправлено: 09.02.2006, 12:57


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

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



Попробовал так:
CODE

FILE *file;
file = fopen( "123.bmp", "rb" );
fread ( tmp, length, 1, file );
fclose ( file );

TMemoryStream *stream = new TMemoryStream ();
stream -> Write ( tmp, length );
Image1 -> Picture -> Bitmap -> LoadFromStream ( stream );

Не получается! Выдает access violation!!!

Отредактировано Aptem — 09/02/2006, 12:58
Guest
Отправлено: 09.02.2006, 13:36


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







А tmp распределен? (место выделено)
AVC
Отправлено: 09.02.2006, 13:51


Ветеран

Группа: Модератор
Сообщений: 1583



Так работает
CODE

#include <stdio.h>

void __fastcall TForm1::Button8Click(TObject *Sender)
{
AnsiString fname = ExtractFilePath(Application->ExeName) + "bugs1.bmp";
FILE *fbmp= fopen(fname.c_str(), "rb");
if (!fbmp)  return;
fseek(fbmp, 0, SEEK_END);
int fsize = ftell(fbmp);
fseek(fbmp, 0, SEEK_SET);

char *temp = new char[fsize];
try {
fread(temp, fsize, 1, fbmp);
fclose(fbmp);

TMemoryStream *mbmp = new TMemoryStream();
try {
   mbmp->Write(temp, fsize);
   mbmp->Position = 0;
   Image1->Picture->Bitmap->LoadFromStream(mbmp);
} __finally { delete mbmp;}

}
__finally { delete[] temp;}

}
vitavita
Отправлено: 09.02.2006, 16:38


Дежурный стрелочник

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



AVC
QUOTE
Постановка задачи — Есть массив char* в который загружен bmp-файл

Извиняюсь , значит не понял — если в char* полностью загружен bmp , вместе с заголовком , то тогда надо LoadFromStream. (Не понятно только как весь bmp попал в этот массив)
Aptem
Отправлено: 10.02.2006, 09:50


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

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



QUOTE (AVC @ 09/02/2006, 13:51)
Так работает
CODE

#include <stdio.h>

void __fastcall TForm1::Button8Click(TObject *Sender)
{
AnsiString fname = ExtractFilePath(Application->ExeName) + "bugs1.bmp";
FILE *fbmp= fopen(fname.c_str(), "rb");
if (!fbmp) return;
fseek(fbmp, 0, SEEK_END);
int fsize = ftell(fbmp);
fseek(fbmp, 0, SEEK_SET);

char *temp = new char[fsize];
try {
fread(temp, fsize, 1, fbmp);
fclose(fbmp);

TMemoryStream *mbmp = new TMemoryStream();
try {
mbmp->Write(temp, fsize);
mbmp->Position = 0;
Image1->Picture->Bitmap->LoadFromStream(mbmp);
} __finally { delete mbmp;}

}
__finally { delete[] temp;}

}

А если у меня в масииве char не весь bmp файл, а только сама картинка и палитра без заголовка. Как мне тогда загрузить ее через LoadFromStream?
avc*
Отправлено: 10.02.2006, 10:07


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







QUOTE

А если у меня в масииве char не весь bmp файл, а только сама картинка и палитра без заголовка. Как мне тогда загрузить ее через LoadFromStream?

Либо достроить файл до конца, либо поискать другой метод (см.vitavita)
Aptem
Отправлено: 10.02.2006, 16:21


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

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



Спасибо всем за помощь. Воспользовался советом avc.

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