Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > TMemoryStream to BYTE


Автор: lamber 22.8.2010, 11:34
Суть в следующем у меня есть изображение в TMemoryStream нужно его перегнать в BYTE как я уже только не извращался вообщем вот код

Код

BYTE *image= new BYTE[data->Size];
image=(BYTE*)data->Memory;

data->SaveToFile("image.png");
FILE* f;
f=fopen("test.png","wb");
fwrite(image,data->Size,sizeof(image),f);


data тут соответственно TMemoryStream при сохранении в файл все окей но как только сохраняю BYTE хрень одна какая-то.

Автор: lamber 22.8.2010, 13:14
Ответ получен благодаря Zor'у
Код

BYTE *image = new BYTE[data->Size];
memmove(image, data->Memory, data->Size);

data->SaveToFile("image.png");

FILE* f;
f = fopen("test.png", "wb");
fwrite(image, data->Size, 1, f);

// delete [] image;

Автор: mrbrooks 23.8.2010, 07:32
ага. отличное корявое решение.
не стоит забывать, что у TMemoryStream есть методы чтения. К примеру ReadBuffer

Автор: lamber 25.8.2010, 15:11
2mrbrooks
Хорошо подскажите код с более правильным решением, будем только рады.

Автор: Alexeis 25.8.2010, 15:39
Код

data->Position = 0;
data->Read(image, data->Size);

Автор: SVN74 25.8.2010, 15:39
Вот краткий пример, - как поместить картинку в TMemoryStream, а потом считать в массив...
Код

TJPEGImage *jpg;
TMemoryStream* pms;
jpg = new TJPEGImage;
pms = new TMemoryStream();

pms->Position=0; 
jpg->SaveToStream(pms);
pms->Position=0;

int VSize = pms->Size;
char *VSource=new char[N];
pms->ReadBuffer(&VSource[0],VSize);

Автор: mrbrooks 25.8.2010, 15:53
Цитата(lamber @  25.8.2010,  16:11 Найти цитируемый пост)
Хорошо подскажите код с более правильным решением, будем только рады. 

да здесь вариантов воз и маленькая тележка:
Код

    #include <memory>
    //вариант 1
    String path = ExtractFilePath(Application->ExeName) + "\\test.jpg";
    if(FileExists(path))
    {
         std::auto_ptr<TMemoryStream>ms(new TMemoryStream());
         ms->LoadFromFile(path);
         byte *buffer = new byte[ms->Size];
         ms->ReadBuffer(buffer, ms->Size);
         delete [] buffer;
    }

    //вариант 2
    String path = ExtractFilePath(Application->ExeName) + "\\test.jpg";
    if(FileExists(path))
    {
         TBytes bytes;
         std::auto_ptr<TBytesStream>bs(new TBytesStream(bytes));
         bs->LoadFromFile(path);
         bs->Bytes; // - массив байт
    }    


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)