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'у. Какже тогда это изображение отобразиться? Не очень понял...
|
|
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
|
Предыдущее сообщение мое — не авторизовалось |
|
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.
|
|