Mozajka z pliku

Odpowiedz Nowy wątek
2006-12-02 11:23

Rejestracja: 13 lat temu

Ostatnio: 12 lat temu

0

zrobiłem procedure która otwiera obojętnie jaki plik i pobiera trzy znaki z niego tworzy z tych zankow kolor rgb i ustawia taki kolor jakiegoś piksela i robi tak az skończy sie plik ...niby easy ale nie wiem czemu nie działa . oto kod :

{w globalnej}
var
bmp:Tbitmap
{a teraz procedura}
procedure konfilbmp;
 var 
plik:file;
x,y:integer;
buf:array[1..3] of char;
R: byte;
G:byte;
B:byte;
odczytane,pozycja:integer;
begin
 if Form1.open.Execute then Form1.edit2.Text:=Form1.open.FileName; //pobiera ciezke pliku do odczytu
if Form1.save.Execute then Form1.edit3.Text:=Form1.save.FileName; //pobiera sciezke do zapisu
try
 bmp := TBitmap.Create;

x:=0;
y:=0;
pozycja:=0;
assignfile(plik,Form1.Edit2.Text);
reset(plik);
 bmp.Width := 1024;
  bmp.Height:= 300; // wczeniej mialem trunc(filesize(plik))/(1024*3))+1
 except on exception do
ShowMessage('blad 1');
end;
repeat
try
seek(plik,pozycja);
BlockRead(plik,buf,sizeof(buf),odczytane); //odczytywanie 3 znakow
pozycja:=pozycja+odczytane;
R:=ord(buf[1]);             // ustawianie kazdego znaku na r ,g i b
G:=ord(buf[2]);
B:=ord(buf[3]);
bmp.Canvas.Pixels[x,y]:=RGB(r,g,b);  //ustawienie piksela na kolor stworzony z rgb
INC(X);
if x=1025 then
begin
x:=0  ;
inc(y);
end;
except on exception do
ShowMessage('blad 2');
end;
until odczytane=0;  //kiedy juz nic nie odczutam to koniec
closefile(plik);
bmp.SaveToFile(Form1.Edit3.Text); //zapisz bitmape do pliku
end;

Debugger mowi ,ze wszystko jest ok ale...
wyskakuje mi blad "Access violation at adress 3B646E65. Read of adress 3B646E65" ... o co kaman


"Nie po to piszę programy żeby korzystać z cudzych"

Pozostało 580 znaków

2006-12-02 13:53

Rejestracja: 13 lat temu

Ostatnio: 12 lat temu

0

super super.. mam tylko kilka pytań do tego kodu, bo nie zbyt go rozymiem co daje inc(pixWsk)..jak picwsk to wskaznik do byte..
PixWsk:=Bitmap.ScanLine [V]; <--co to jest
najlepiej jak bys mi opisal tą procedure bo nie moge sie zbytonio w niej skumać...

i jeszcze jeden mam problem konwersja jpg do bmp ..robiłem to za pomocą bmp.assign(jpg);
gdzie jpgyo TJPEGImage..ale to mi zamuliło kompa na 30s..bo tyle trwała konwersja..nie ma jakiegośc szybkiego sposobu


"Nie po to piszę programy żeby korzystać z cudzych"

Pozostało 580 znaków

2006-12-02 15:19

Rejestracja: 14 lat temu

Ostatnio: 3 lata temu

0
procedure Mozaika(var Bitmap:TBitmap;FileName:String);
var
Memory:TMemoryStream;
H,V,IloscLinii:Integer;
Buffer:byte;
PixWsk:^Byte;
const Szerokosc =1024;
begin

Memory:=TmemoryStream.Create;
Memory.LoadFromFile(FileName);
Memory.Position:=0;
H:=0 ;
V:=0;

IloscLinii:=Memory.Size div  (Szerokosc*3)+1;
Bitmap.Width :=Szerokosc;
Bitmap.Height :=IloscLinii;
Bitmap.pixelformat:=pf24bit;
PixWsk:=Bitmap.ScanLine [0];

repeat
Memory.ReadBuffer(buffer,1);
PixWsk^:=Buffer;
inc(H);
inc(PixWsk);

if (H=Szerokosc*3  )then
begin
inc(V);
H:=0;
if (V<= Bitmap.Height-1) then PixWsk:=Bitmap.ScanLine [V];
end;

until Memory.Position=Memory.Size ;
Memory.Free;

end;

Pozostało 580 znaków

Odpowiedz

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0