Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.119.124.202] |
|
Сообщ.
#1
,
|
|
|
В текстовом файле записано цифры. Каждая цифра с новой строки. Цифры означают RGB. У меня холст 100 на 100 пикселей, 10000 пикселей, умножаем на 3 (RGB). Получается 30000 цифр RGB. Столько значений у меня хранятся в текстовом файле в столбик. Ориентируясь по этим данным нужно нарисовать картинку на компоненте Image. Т.е. берем первые три строки в текстовом файле рисуем пиксель, следующие три строки рисуем пиксель по соседству в линии(горизонтали), пока полностью не нарисуем линию и переходим к следующей линий и так пока картинка не будет готова. Загрузку файлов я уже сделала и записала в массив.
Пример кода и исходники где есть текстовый файл. Прикреплённый файлEx2.zip (39,67 Кбайт, скачиваний: 4) unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls; type TDynamicArrayOfIntegers = array of Integer; TForm1 = class(TForm) Memo1: TMemo; Image1: TImage; Memo2: TMemo; procedure FormShow(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} function LoadFromFile(const fname: String; lines: TStrings): TDynamicArrayOfIntegers; var I: Integer; FileDir:String; begin FileDir:=fname; if FileExists(FileDir) then begin lines.LoadFromFile(FileDir); SetLength(Result, lines.Count); for i := 0 to lines.Count - 1 do Result[i] := StrToIntDef(lines[i], 0); end else Result := nil; end; procedure TForm1.FormShow(Sender: TObject); var str:TDynamicArrayOfIntegers; y:Integer; begin str:=LoadFromFile('data11.txt', Memo1.Lines); for y := 0 to High(str) do begin Memo2.Lines.Add(IntToStr(y mod 3)); end; end; end. |
Сообщ.
#2
,
|
|
|
У тебя там нормальная картинка или какой-то рандомный набор пикселей?
А то вот так выглядит: Прикреплённый файл001770.png (26,22 Кбайт, скачиваний: 36) |
Сообщ.
#3
,
|
|
|
Цитата У тебя там нормальная картинка или какой-то рандомный набор пикселей? А то вот так выглядит: Все правильно, так и должно быть. Там просто случайные пиксели которые нужно нарисовать. |
Сообщ.
#4
,
|
|
|
Цитата Katerina1993 @ Все правильно, так и должно быть. Там просто случайные пиксели которые нужно нарисовать. Ну предупреждать жэж надо! Пришлось потерять время на проверку. Пример писал на Лазарусе. Скопипастишь там себе нужные куски. unit uData; {$mode ObjFPC}{$H+} interface uses Classes, SysUtils, Graphics; type { TRGBTextLoader } TRGBTextLoader = class(TStringList) private LBitmap: TBitmap; private procedure DrawPicture; public constructor Create(ABitmap: TBitmap); reintroduce; procedure LoadFromFile(const FileName: string); override; end; implementation uses LclType; { TRGBTextLoader } procedure TRGBTextLoader.DrawPicture; var pbgr: PRGBTriple; idx: int32 = 0; row, col: int32; begin if Self.Count mod 3 <> 0 then raise Exception.CreateFmt('Количество исходных строк (%d) некратно 3.', [Self.Count]); // вывод точек по ширине, пока не закончится высота LBitmap.Clear(); for row:= 0 to LBitmap.Height - 1 do begin if idx >= Self.Count then break; pbgr:= LBitmap.ScanLine[row]; for col:= 0 to LBitmap.Width - 1 do begin if idx >= Self.Count then break; pbgr^.rgbtRed:= NativeInt(Self.Objects[idx + 0]) and $FF; pbgr^.rgbtGreen:= NativeInt(Self.Objects[idx + 1]) and $FF; pbgr^.rgbtBlue:= NativeInt(Self.Objects[idx + 2]) and $FF; inc(pbgr); inc(idx, 3); end; end; end; constructor TRGBTextLoader.Create(ABitmap: TBitmap); begin assert(assigned(ABitmap)); inherited Create(); LBitmap:= ABitmap; end; procedure TRGBTextLoader.LoadFromFile(const FileName: string); var idx, b: int32; begin inherited LoadFromFile(FileName); for idx:= 0 to Self.Count - 1 do begin if not TryStrToInt(Self[idx], b) or not (b in [0..255]) then raise Exception.CreateFmt('Ошибка преобразования, строка %d.', [idx]); Objects[idx]:= TObject(NativeInt(b)); end; Self.DrawPicture(); end; end. procedure TFormMain.FormCreate(Sender: TObject); var loader: TRGBTextLoader; bmp: TBitmap; begin bmp:= TBitmap.Create(); try bmp.PixelFormat:= pf24bit; bmp.SetSize(Image.Width, Image.Height); loader:= TRGBTextLoader.Create(bmp); try try loader.LoadFromFile('data11.txt'); except on e: Exception do Application.MessageBox('Ошибка', PChar(e.Message), MB_ICONSTOP or MB_OK); end; finally loader.Free(); end; Image.Picture.Assign(bmp); finally bmp.Free(); end; end; Прикреплённый файл445030.7z (65,07 Кбайт, скачиваний: 21) |
Сообщ.
#5
,
|
|
|
Verevkin, а можно вызывать Self.DrawPicture; не внутри процедуры LoadFromFile, а отдельно например
Создается объект loader:= TRGBTextLoader.Create(Image1.Picture,bmp,Memo1,0); а дальше вызывается. loader.DrawPicture; Попробовала так сделать не получается. Свойство Objects[idx]:= TObject(NativeInt(b));, удается передать только когда DrawPicture вызывается внутри LoadFromFile. Мне нужно сделать процедуру внешней, чтобы загрузить текстовый файл один раз, а потом отдельно использовать процедуры для раскрашивания холста. |
Сообщ.
#6
,
|
|
|
Цитата Katerina1993 @ а можно вызывать Self.DrawPicture; не внутри процедуры LoadFromFile, а отдельно например Мне всё равно. Я ж тебе исходник отдал, делай с ним чо хочешь. |