Форум: "Основная";
Текущий архив: 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.035 c