Показать сообщение отдельно
  #23  
Старый 02.06.2011, 00:41
Cramol Cramol вне форума
Прохожий
 
Регистрация: 31.05.2011
Сообщения: 13
Репутация: 10
По умолчанию

В общем, кое-как получилось, в принципе.
Только не могу понять как теперь на Image отобразить уменьшенную получившуюся картинку. Вот изначально, когда она преобразовывается попиксельно в два цвета (черный и белый), размеры картинки, отображаемые в Image, одинаковые вне зависимости от того, какая в действительности ширина и высота исходной картинки.
Потом я прохожусь циклами для преобразования квадратиков 10х10, опять таки хочу отобразить полученный результат на Image, но он уже отображается такой длины и высоты, как сама картинка, а не размеры Image. Т.е. во весь размер.
Как сделать, чтобы она была по размерам Image? т.е. уменьшенная.

Код:
procedure Tmp32jpg.btn1Click(Sender: TObject);
Type
 TRGB = Record
   B,G,R: Byte;
  end;
 PRGBLine = ^TRGBLine;
 TRGBLine = Array [0..65535] of TRGB;
Var
 F: TFileStream;
 Line: PRGBLine;
 R, j, i: Integer;
 C1, C2, C3, Y: Byte;
 mx,my:Integer;
 pix:Integer;
 chx,chy,m,n,m2,n2:Integer;
begin
 if dlgOpen1.Execute Then
 F:= TFileStream.Create(dlgOpen1.FileName, fmOpenRead) Else Exit;
 Bmp:= TBitmap.Create;
 Bmp.PixelFormat:= pf24bit;
 if (F.Size Mod 3) = 0 Then R:= (F.Size Div 3)
  Else R:= (F.Size Div 3) + 1 ;
 Bmp.Width:= Round(Sqrt(R));
 Bmp.Height:= Bmp.Width;
 if (Bmp.Width*Bmp.Height) < R Then Bmp.Height:= Bmp.Height + 1;
 For j:= 0 To Bmp.Height - 1 Do
  begin
   Line:= Bmp.ScanLine[j];
   F.Read(Line^, Bmp.Width*3);
   For i:= 0 To Bmp.Width - 1 Do
    begin
     if (Line^[i].R + Line^[i].G + Line^[i].B) Div 3 > 127 Then
      begin
       Line^[i].R:= $FF; Line^[i].g:= $FF; Line^[i].B:= $FF;
      end
     Else
      begin
       Line^[i].R:= $00; Line^[i].g:= $00; Line^[i].B:= $00;
      end;
    end;
  end;
 img1.Canvas.Draw(0, 0, Bmp);

 mx:=10;
 my:=10;

 chx:=Bmp.Width div 10;
 chy:=Bmp.Height div 10;

for m:=0 to chx do
begin
for m2:=0 to chy do
begin
 pix:=0;

 for i:=m2*10 to (mx*(m2+1))-1 do
 begin
  for j:=m*10 to (my*(m+1))-1 do
  begin
   if bmp.Canvas.pixels[j,i]=$000000 then
    Inc(pix);
   end;
 end;

 if pix<=50 then
 begin
  for i:=m2*10 to mx*(m2+1) do
  begin
    for j:=m*10 to my*(m+1) do
    begin
     bmp.Canvas.Pixels[j,i]:=$ffffff;
    end;
  end;
 end;

 if pix>50 then
 begin
  for i:=m2*10 to mx*(m2+1) do
  begin
    for j:=m*10 to my*(m+1) do
    begin
     bmp.Canvas.Pixels[j,i]:=$000000;
    end;
  end;
 end;

end;
end;

 ShowMessage('bmp: '+inttostr(bmp.width) +' , img: '+inttostr(img1.width));
 F.Free;
end;

Намудрил, походу, че-то в коде
Ответить с цитированием