![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
почему портится изображение Bmp2 при изменении Bmp1
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]
> забавно а у меня оба обрезались...
> :(
>
>
> Чувак, покажи весь кусок кода, где у тебя используются эти
> битмапы! А то как-то неважно в последнее время с чтением
> мыслей.
Щас выложу...