Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 25.02.2017, 11:46   #11
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

По быстрому примерчик для чтения одной картинки. Если массово загружать, то лучше конечно не по одному байту читать да и ScanLine вместо Canvas.Pixels
Код:
procedure TForm1.Button1Click(Sender: TObject);
var xStream: TFileStream;
    i,j,k: Integer;
    xBitmap: TBitmap;
    xBuffer: Byte;
begin
  Image1.Transparent:=True;

  xBitmap:=TBitmap.Create;
  xBitmap.PixelFormat:=pf8bit;
  xBitmap.Height:=28;
  xBitmap.Width:=28;
  xStream:=TFileStream.Create('e:\Mnist\train-images.idx3-ubyte',fmOpenRead or fmShareDenyWrite);
  k:=1134; //порядковый номер картинки 1<=k<=60000
  xStream.Position:=16+(k-1)*784;
  for i:=0 to 27 do begin
    for j:=0 to 27 do begin
      xStream.ReadBuffer(xBuffer,1);
      xBitmap.Canvas.Pixels[j,i]:=xBuffer;
    end;
  end;
  Image1.Picture.Bitmap.Assign(xBitmap);
  xBitmap.Free;
  xStream.Free;
end;
Кстати если будешь в массив загружать, то в файле для Integer порядок байтов от старшего к младшему
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 25.02.2017 в 11:50.
Аватар вне форума Ответить с цитированием
Старый 25.02.2017, 12:35   #12
Михаил22042016
Пользователь
 
Регистрация: 21.04.2016
Сообщений: 54
По умолчанию

Цитата:
Сообщение от Alex11223 Посмотреть сообщение
Нужно читать побайтно (например чем-нибудь типа TFileStream) и преобразовывать в нужный вам формат.
Прочитать кол-во картинок (блок 4 байта), дальше для каждой читать кол-во строк и столбцов (2 блока по 4 байта) и читать это количество однобайтовых пикселей.
спасибо.
Через годик другой мб разберусь
Михаил22042016 вне форума Ответить с цитированием
Старый 25.02.2017, 15:21   #13
Михаил22042016
Пользователь
 
Регистрация: 21.04.2016
Сообщений: 54
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
xStream.Position:=16+(k-1)*784;
for i:=0 to 27 do begin
for j:=0 to 27 do begin
xStream.ReadBuffer(xBuffer,1);
тут пара вопросов

если я правильно понимаю то xStream.ReadBuffer(xBuffer,1); = xStream.ReadBuffer(xBuffer,SizeOf(B yte));

а вот тут
xStream.Position:= 16+(k-1)*784 ;
16+(k-1)*(28*28)эта цифра - 16 откуда она

Последний раз редактировалось Михаил22042016; 25.02.2017 в 15:25.
Михаил22042016 вне форума Ответить с цитированием
Старый 25.02.2017, 15:50   #14
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

SizeOf(Byte) = 1
Цитата:
16 откуда она
из описания структуры - в начале файла заголовок 16 байт (4 * 4), а затем 60000 блоков по 784 байта. В том заголовке и количество картинок (60000) и их размеры (28*28). По хорошему это из заголовка нужно взять, а не подставлять константы как в примере. Но пример на то и пример, что бы ТС было над чем подумать ))
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 25.02.2017 в 15:58.
Аватар вне форума Ответить с цитированием
Старый 25.02.2017, 16:57   #15
Михаил22042016
Пользователь
 
Регистрация: 21.04.2016
Сообщений: 54
По умолчанию

да, мне тут есть над чем подумать, пойду гуглить.
это чтение файла по структуре искать?
Михаил22042016 вне форума Ответить с цитированием
Старый 26.02.2017, 07:20   #16
Михаил22042016
Пользователь
 
Регистрация: 21.04.2016
Сообщений: 54
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
Если массово загружать, то лучше конечно не по одному байту
это значит блоками? а если блоками то это не TFileStream, а : File;
BlockRead???
Михаил22042016 вне форума Ответить с цитированием
Старый 26.02.2017, 09:41   #17
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Блок он и есть блок - кусок файла. 1 байт тоже блок. Для этого файла лучше всего сразу считывать всю картинку целиком в массив - блоком в 784 байта тем же методом ReadBuffer. Быстрей точно будет если все картинки обрабатывать. Можно и большим блоком, но обработка в памяти этих картинок чуть усложнится
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 26.02.2017, 11:48   #18
Михаил22042016
Пользователь
 
Регистрация: 21.04.2016
Сообщений: 54
Вопрос

Код:
procedure TForm1.btn15Click(Sender: TObject); 
var xStream: TFileStream;
    i,j,k: Integer;
    xBitmap: TBitmap;
     Buffer: TBytes;
     Size: Integer;  
begin
//  img1.Transparent:=True;
//  img1.Stretch:=True;
  xBitmap:=TBitmap.Create;
  xBitmap.PixelFormat:=pf8bit;
  xBitmap.Height:=28;
  xBitmap.Width:=28;
  xStream:=TFileStream.Create(GetCurrentDir+'\Memo\train-images.idx3-ubyte',fmOpenRead or fmShareDenyWrite);
  k:=StrToInt(edt2.Text); //порядковый номер картинки 1<=k<=60000
  xStream.Position:=16+(k+1)*784;// (k+1) тут +1 т.к. в едит 0
    Size := xStream.Size - xStream.Position;
    SetLength(Buffer, Size);
    xStream.ReadBuffer(Pointer(Buffer)^, Size); 
  for i:=0 to 27 do begin
    for j:=0 to 27 do begin 
      xBitmap.Canvas.Pixels[j,i]:= RGB(Abs(Buffer[(xBitmap.Width*i)+j]-255),Abs(Buffer[(xBitmap.Width*i)+j]-255),Abs(Buffer[(xBitmap.Width*i)+j]-255))  ; 
    end;
  end;
  end;

  img1.Picture.Bitmap.Assign(xBitmap);
  xBitmap.Free;
  xStream.Free;
end;
я на правильном пути?

Последний раз редактировалось Михаил22042016; 26.02.2017 в 11:52.
Михаил22042016 вне форума Ответить с цитированием
Старый 26.02.2017, 12:19   #19
Михаил22042016
Пользователь
 
Регистрация: 21.04.2016
Сообщений: 54
По умолчанию

Код:
procedure TForm1.btn15Click(Sender: TObject);
type
    PixelRGB = packed record b,g,r: byte; end;
    tXarray = array[0..0] of PixelRGB;
    Xarray = ^tXarray;
    YXarray = array of Xarray;
var xStream: TFileStream;
    i,j,k,p,z: Integer;
    xBitmap: TBitmap;
    Buffer: TBytes;
    Size: Integer;
    Scan:YXarray;
begin
//  img1.Transparent:=True;
  img1.Stretch:=True;
  xBitmap:=TBitmap.Create;
  xBitmap.PixelFormat:=pf24bit;
  xBitmap.Height:=28;
  xBitmap.Width:=28;
  SetLength(Scan,xBitmap.Height);
  xStream:=TFileStream.Create(GetCurrentDir+'\Memo\train-images.idx3-ubyte',fmOpenRead or fmShareDenyWrite);
  k:=StrToInt(edt2.Text); //порядковый номер картинки 1<=k<=60000
//  xStream.Position:=16+(k+1)*784;
  for p:=1 to 50000 do begin
    xStream.Position:=16+(p)*784;
    Size := xStream.Size - xStream.Position;
    SetLength(Buffer, Size);
    xStream.ReadBuffer(Pointer(Buffer)^, Size);
    for i:=0 to 27 do begin
      Scan[i]:=xBitmap.ScanLine[i];
      for j:=0 to 27 do begin
        Scan[i][j].r:=Abs(Buffer[(xBitmap.Width*i)+j]-255); // инверсия цвета, чтобы белый был фоном
        Scan[i][j].g:=Scan[i][j].r;
        Scan[i][j].b:=Scan[i][j].r;
      end;
    end;
    Application.ProcessMessages;
    img1.Picture.Bitmap.Assign(xBitmap);
    Sleep(1 );

  end;

  xBitmap.Free;
  xStream.Free;
end;
а это со сканлайном

Последний раз редактировалось Михаил22042016; 26.02.2017 в 13:48.
Михаил22042016 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Где Database Desktop в Delphi 2010 Fog БД в Delphi 6 04.04.2016 03:27
Delphi DataBase hauk70 Помощь студентам 3 27.06.2012 13:07
delphi 2005 + database desktop semidor БД в Delphi 8 25.05.2012 12:04
Delphi DataBase kiko Фриланс 5 15.06.2010 21:29
Database в Delphi 2006 Vito89 БД в Delphi 1 24.02.2010 09:12