Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2004.10.31;
Скачать: [xml.tar.bz2];

Вниз

почему портится изображение 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.53 MB
Время: 0.036 c
14-1097718843
Думкин
2004-10-14 05:54
2004.10.31
С днем рождения! 14 октября


1-1097607921
Alexey Romanskiy
2004-10-12 23:05
2004.10.31
HTML в webbrowser


1-1097754397
}|{yk
2004-10-14 15:46
2004.10.31
Формат даты в DateTimePicker


1-1098204141
oleg_SYS
2004-10-19 20:42
2004.10.31
Динамическая библиотека DLL и ей функции


6-1093112613
Луарвик
2004-08-21 22:23
2004.10.31
Замена NMHTTP у Indy





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский