Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

почему портится изображение Bmp2 при изменении Bmp1


Страницы:   1 2

TeNY ©   (2004-10-16 09:51:00) 

почему портится изображение Bmp2 при изменении Bmp1
Bmp2 :=  Bmp1 ;
Bmp1.Width  :=  Bmp1.Width div x;
Bmp1.Height :=  Bmp1.Height div x;


Fenik   (2004-10-19 20:24:00) [1]

LOL!!!


Dema-X   (2004-10-19 18:32:00) [2]

нет потому что всё портит BmpX2.SaveToStream(ms2);
BmpX1.SaveToStream(ms1);вот еслиби размер узнать то можно бало бы память напрямую сравнивать


Мирон   (2004-10-19 11:19:00) [3]

TeNY ©   (19.10.04 7:01) [27]

Ну тогда и не надо крошить картинки. Просто сравни частьпотоков

function BitmapsAreEqual(BmpX1, BmpX2: TBitmap;x:Integer): Boolean;
begin
Result := False;
ms1:= TMemoryStream.Create;
ms2:= TMemoryStream.Create;
BmpX2.SaveToStream(ms2);
BmpX1.SaveToStream(ms1);
if ms1.Size = ms2.Size then
Result := CompareMem(ms1.Memory,ms2.Memory, ms1.Size div X);
ms1.Free;
ms2.Free;
end;


Подходит?


TeNY   (2004-10-19 07:34:00) [4]


> ЮЮ ©   (19.10.04 07:15) [28]
> >а так если скажем в 2 раза обрежем то и грузить меньше
> будет
> Ставь сразу BmpX2.Width := 0, не надо будет в цикле постоянно
> уменьшать :)
:)


ЮЮ   (2004-10-19 07:15:00) [5]

>а так если скажем в 2 раза обрежем то и грузить меньше будет
Ставь сразу BmpX2.Width := 0, не надо будет в цикле постоянно уменьшать :)

А по-русски, хоть параметр у тебя и не var, это никоим образом не спасает содержимое объекта и твой битмап при вызове функции постоянно уменьшается в X раз


TeNY   (2004-10-19 07:01:00) [6]


> Мирон ©   (19.10.04 01:20) [25]
> TeNY ©   (17.10.04 20:17) [14]
>
> А надо сравнивать только левые части картинок?

не обязательно,нужно сравнивать всё полность вот только грузить начинает по полной а так если скажем в 2 раза обрежем то и грузить меньше будет я проанализировал и пришел к этому не самому лувшему способу потому что, если содавать битмап и грузить в него скажем каждый 3 пиксел то это очень долго будет


TeNY   (2004-10-19 06:58:00) [7]


> Mihey_temporary ©   (18.10.04 21:45) [24]
> A constant (const) parameter is like a local constant or
> read-only variable. Constant parameters are similar to value
> parameters, except that you can’t assign a value to a constant
> parameter within the body of a procedure or function, nor
> can you pass one as a var parameter to another routine.
> (But when you pass an object reference as a constant parameter,
> you can still modify the object’s properties.)

Говори по нашему пожалуйста,это русскоязычный форум.


Мирон   (2004-10-19 01:20:00) [8]

TeNY ©   (17.10.04 20:17) [14]

А надо сравнивать только левые части картинок?


Mihey_temporary   (2004-10-18 21:45:00) [9]


> Кхм... а файлы-то где?


Близко, но не точно. Вот, что надо было:

A constant (const) parameter is like a local constant or read-only variable. Constant parameters are similar to value parameters, except that you can’t assign a value to a constant parameter within the body of a procedure or function, nor can you pass one as a var parameter to another routine. ( But when you pass an object reference as a constant parameter, you can still modify the object’s properties.)


Dema-X   (2004-10-18 18:40:00) [10]


> ЮЮ ©   (18.10.04 10:23) [22]
> i:=0;
> while (i-1)<>(CheckListBox1.Items.Count-1) do begin
>  i:=i+1;
>  if (mimg[i]<>nil) then
>  if BitmapsAreEqual(mimg[x],mimg[i],2)then mw:=False;
> end;
>
> В цикле вызывается функция, которая корёжит Bitmap-ы, передаваемые
> в качестве параметров, т.е. mimg[i] (i = 0...CheckListBox1.Items.Count-1),
> и ещё удивляется, почему это его код успешно выполняется
> :)

Тот же результат получался и случае создания отдельных классов


ЮЮ   (2004-10-18 10:23:00) [11]

i:=0;
while (i-1)<>(CheckListBox1.Items.Count-1) do begin
 i:=i+1;
 if (mimg[i]<>nil) then
 if BitmapsAreEqual(mimg[x],mimg[i],2)then mw:=False;
end;

В цикле вызывается функция, которая корёжит Bitmap-ы, передаваемые в качестве параметров, т.е. mimg[i] (i = 0...CheckListBox1.Items.Count-1), и ещё удивляется, почему это его код успешно выполняется :)


TeNY   (2004-10-18 09:45:00) [12]


> VMcL ©   (18.10.04 07:51) [20]
> Неудивительно. Учить матчасть.

Где математика?Какая математика?Непонял.


> Ищи логическую ошибку в своей программе.

видимо Delphi глючит потому что сегодня откомпилил и всё пучком вроде бы,но и наверно ошибка всё таки есть,буду искать.


VMcL   (2004-10-18 07:51:00) [13]

>> TeNY ©  (17.10.04 20:17) [14]

> а заодно изменяется значение в mimg[x],mimg[i]

Неудивительно. Учить матчасть.

procedure TForm1.Button1Click(Sender: TObject);
var
 Bmp1, Bmp2: TBitmap;
begin
 Bmp1 := nil;
 Bmp2 := nil;
 try
   Bmp1 := TBitmap.Create;
   Bmp2 := TBitmap.Create;

   Bmp1.Assign(Clipboard);
   Bmp2.Assign(Clipboard);
   ShowMessage(Format('%d; %d', [Bmp1.Width, Bmp2.Width]));
   Bmp1.Width := Bmp1.Width div 2;
   ShowMessage(Format('%d; %d', [Bmp1.Width, Bmp2.Width]));
 finally
   FreeAndNil(Bmp1);
   FreeAndNil(Bmp2);
 end;
end;


D6, Win2K. Работает так, как и ожидается:
415; 415
207; 415


Ищи логическую ошибку в своей программе.


VMcL   (2004-10-18 07:45:00) [14]

>> Mihey_temporary ©  (17.10.04 21:46) [16]

> Files and instances of structured types that contain filescan be passed only as variable (var) parameters.

Кхм... а файлы-то где?


TeNY   (2004-10-18 06:44:00) [15]

Files and instances of structured types that contain files can be passed only as variable (var) parameters.
Файлы и примеры для сруктурных типов чтобы содержать в себе фаылы могут передаватся только как переменный параметр( VAR).
И к чему это ты привел Mihey я не понял тебя,данные передаются как переменный параметр у меня, я присваиваиваю их другому обьекту факт изменения изображения всё равно остается.


TeNY   (2004-10-18 06:25:00) [16]


> Mihey_temporary ©   (17.10.04 21:46) [16]
> Во-вторых, ты соврал в посте [7].

в 7 посте я говориь про свой пример а не про твой так что никакого вранья

а особого различия между примерами не вижу а почему же он не работает?


Mihey_temporary   (2004-10-17 21:46:00) [17]

Во-первых, в справке по типам параметров написано:

Files and instances of structured types that contain files can be passed only as variable (var) parameters.

Во-вторых, ты соврал в посте [7].


TeNY   (2004-10-17 20:20:00) [18]

на форму бросить Timer1: TTimer;CheckListBox1: TListBox;
ну и события соответсвующие
  procedure Timer1Timer(Sender: TObject);
  procedure CheckListBox1Click(Sender: TObject);
,и ещё проблема при замене TBITMaP на TPICTURE отказывается читать откопированные из пайнта куски изображения хотя сриншоты нормально грузит.


TeNY   (2004-10-17 20:17:00) [19]

Вот код
uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, ExtCtrls,clipbrd, StdCtrls;

type
 TForm1 = class(TForm)
   Timer1: TTimer;
   CheckListBox1: TListBox;
   Image1: TImage;
   procedure Timer1Timer(Sender: TObject);
   procedure CheckListBox1Click(Sender: TObject);
 end;

var
 Form1: TForm1;mimg:array[Byte]of TBitmap;
 i,x:Byte;mw:boolean;
 ms1, ms2: TMemoryStream;s:String;
implementation
{$R *.dfm}
function BitmapsAreEqual(BmpX1, BmpX2: TBitmap;x:Integer): Boolean;
begin
Result := False;
ms1:= TMemoryStream.Create;
ms2:= TMemoryStream.Create;
BmpX2.Width:=BmpX2.Width div x;
BmpX1.Width:=BmpX1.Width div x;

BmpX2.SaveToStream(ms2);
BmpX1.SaveToStream(ms1);
if ms1.Size = ms2.Size then
Result := CompareMem(ms1.Memory,ms2.Memory, ms1.Size);
ms1.Free;
ms2.Free;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
if Clipboard.HasFormat(CF_BITMAP)then
begin
mw:=true;x:=CheckListBox1.Items.Count;s:='Image '+IntToStr(x+1);i:=0;

if mimg[x]=nil then mimg[x]:=TBitmap.Create;//Создаем
  mimg[x].Assign(Clipboard);

while (i-1)<>(CheckListBox1.Items.Count-1) do begin
i:=i+1;
if (mimg[i]<>nil) then
if BitmapsAreEqual(mimg[x],mimg[i], 2 )then mw:=False;

end;
if mw then CheckListBox1.Items.Add(s);

end;end ;
procedure TForm1.CheckListBox1Click(Sender: TObject);
begin
Image1.Picture.Assign(mimg[CheckListBox1.Itemindex]);
end;
end.

x:Integer-коэффициент деления
в строках
BmpX2.Width:=BmpX2.Width div x;
BmpX1.Width:=BmpX1.Width div x;

при просмотре отладчиком при делении BmpX2 делится BmpX1 и тоже при делении BmpX1 а заодно изменяется значение в
mimg[x],mimg[i]почему такая ботва идет так и не понял система XP Delphi7


TeNY   (2004-10-17 07:46:00) [20]


> Mihey_temporary ©   (16.10.04 22:57) [11]
>
> > TeNY ©   (16.10.04 20:06) [7]
> > забавно а у меня оба обрезались...
> > :(
>
>
> А не мог бы ты ещё раз повторить это дело, убедиться, что
> оба обрезались, сохранить всё дело в папочку, запаковать
> и выложить в Интернет, чтобы можно было скачать и посмотреть?
>
>
> Мирон ©   (17.10.04 01:06) [12]
> TeNY ©   (16.10.04 20:06) [7]
> забавно а у меня оба обрезались...
> :(
>
>
> Чувак, покажи весь кусок кода, где у тебя используются эти
> битмапы! А то как-то неважно в последнее время с чтением
> мыслей.

Щас выложу...


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо