Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.10.31;
Скачать: CL | DM;

Вниз

почему портится изображение Bmp2 при изменении Bmp1   Найти похожие ветки 

 
TeNY ©   (2004-10-16 09:51) [0]

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


 
begin...end ©   (2004-10-16 09:57) [1]

В смысле - портится? Изменяется так же, как и Bmp1? Так это неудивительно.


 
Мирон ©   (2004-10-16 10:15) [2]

BMP2.Assign(BMP1);


 
TeNY ©   (2004-10-16 12:54) [3]


> begin...end ©   (16.10.04 09:57) [1]
> В смысле - портится? Изменяется так же, как и Bmp1? Так
> это неудивительно.

А как без измениния сделать?


 
TeNY ©   (2004-10-16 13:55) [4]


> Мирон ©   (16.10.04 10:15) [2]
> BMP2.Assign(BMP1);

что assig что := один хрен исходное изображение меняет параметры


 
Мирон ©   (2004-10-16 15:15) [5]

TeNY ©   (16.10.04 13:55) [4]

Не может быть.


 
Мирон ©   (2004-10-16 15:15) [6]

procedure TForm1.FormPaint(Sender: TObject);
var
   B1, B2: TBitmap;
begin
   B1 := TBitmap.Create;
   B2 := TBitmap.Create;
   try
       B1.Width := 100;
       B1.Height := 100;
       B1.Canvas.LineTo(100, 100);
       B2.Assign(B1);
       B1.Width := B1.Width div 2;
       B1.Height := B1.Height div 2;
       Canvas.Draw(0, 0, B1);
       Canvas.Draw(150, 0, B2);
   finally
       B1.Free;
       B2.Free;
   end;
end;


 
TeNY ©   (2004-10-16 20:06) [7]

забавно а у меня оба обрезались...
:(


 
Defunct ©   (2004-10-16 20:50) [8]

TeNY

Вот этот код точно скопирует содержимое Bmp1 в Bmp2, при этом Bmp1 вы будете потом вольны изменять.

Bmp2 := TBitmap.Create;
Bmp2.Width := Bmp1.Width;
Bmp2.Height := Bmp1.Height;
Bmp2.Canvas.Draw(0,0, Bmp1);


а здесь уже можете менять Bmp1:

Bmp1.Width  :=  Bmp1.Width div x;
Bmp1.Height :=  Bmp1.Height div x;


 
Fenik   (2004-10-16 20:54) [9]

Блин, TeNY, купи уже какую-нить книжку по Делфи.
Пользы больше будет, чем от хучи вопросов в форуме.


 
TeNY ©   (2004-10-16 21:20) [10]

Удалено модератором


 
Mihey_temporary ©   (2004-10-16 22:57) [11]


> TeNY ©   (16.10.04 20:06) [7]
> забавно а у меня оба обрезались...
> :(


А не мог бы ты ещё раз повторить это дело, убедиться, что оба обрезались, сохранить всё дело в папочку, запаковать и выложить в Интернет, чтобы можно было скачать и посмотреть?


 
Мирон ©   (2004-10-17 01:06) [12]

TeNY ©   (16.10.04 20:06) [7]
забавно а у меня оба обрезались...
:(


Чувак, покажи весь кусок кода, где у тебя используются эти битмапы! А то как-то неважно в последнее время с чтением мыслей.


 
TeNY ©   (2004-10-17 07:46) [13]


> 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]
> забавно а у меня оба обрезались...
> :(
>
>
> Чувак, покажи весь кусок кода, где у тебя используются эти
> битмапы! А то как-то неважно в последнее время с чтением
> мыслей.

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


 
TeNY ©   (2004-10-17 20:17) [14]

Вот код
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 20:20) [15]

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


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

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

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

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


 
TeNY ©   (2004-10-18 06:25) [17]


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

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

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


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

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


 
VMcL ©   (2004-10-18 07:45) [19]

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

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

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


 
VMcL ©   (2004-10-18 07:51) [20]

>>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


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


 
TeNY ©   (2004-10-18 09:45) [21]


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

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


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

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


 
ЮЮ ©   (2004-10-18 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), и ещё удивляется, почему это его код успешно выполняется :)


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


> ЮЮ ©   (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),
> и ещё удивляется, почему это его код успешно выполняется
> :)

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


 
Mihey_temporary ©   (2004-10-18 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) [25]

TeNY ©   (17.10.04 20:17) [14]

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


 
TeNY ©   (2004-10-19 06:58) [26]


> 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.)

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


 
TeNY ©   (2004-10-19 07:01) [27]


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

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


 
ЮЮ ©   (2004-10-19 07:15) [28]

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

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


 
TeNY ©   (2004-10-19 07:34) [29]


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


 
Мирон ©   (2004-10-19 11:19) [30]

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;


Подходит?


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

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


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

LOL!!!



Страницы: 1 вся ветка

Текущий архив: 2004.10.31;
Скачать: CL | DM;

Наверх




Память: 0.55 MB
Время: 0.029 c
1-1098181125
__Strelok__
2004-10-19 14:18
2004.10.31
DateTimePicker - Дата и время


3-1096879409
Lansky
2004-10-04 12:43
2004.10.31
Запись из одной таблицы в другую


9-1088678971
Proger
2004-07-01 14:49
2004.10.31
Загрузка растра


1-1097678011
Максим
2004-10-13 18:33
2004.10.31
Plug In


1-1097589032
П7
2004-10-12 17:50
2004.10.31
Анимированне обои раб.стола