Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Мультимедиа в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 07.07.2009, 10:08   #1
Son
Пользователь
 
Аватар для Son
 
Регистрация: 24.11.2008
Сообщений: 76
По умолчанию Копировать Bitmap

Не могу разобраться с работой с Bitmap'ом. Пытаюсь скопировать один Bitmap в другой:
Код:
procedure TForm1.Button2Click(Sender: TObject);
var b1,b2:TBitmap;
    x,y,w,h:integer;
    pb1,pb2:PDWORD;
    c:PRGBQuad;
begin
b1:=TBitmap.Create;
b2:=TBitmap.Create;
if (OpenPictureDialog1.Execute) and (FileExists(OpenPictureDialog1.FileName)) then
  begin
  b1.LoadFromFile(OpenPictureDialog1.FileName);
  w:=b1.Width;
  h:=b1.Height;
  b2.Width:=w;
  b2.Height:=h;
  for y:=0 to h-1 do
    begin
    pb1:=b1.ScanLine[y];
    pb2:=b2.ScanLine[y];
    for x:=0 to w-1 do
      begin
      c:=PRGBQuad(pb1);inc(pb1,4);
      pb2^:=DWord(c);inc(pb2,4);
      end;
    end;
  end;
end;
Выдает ошибку обращения к памяти. В чем ошибка? Заранее спасибо.
Лучше сдохнуть, чем жить с иглой в яйце (Кащей Бессмертный)
Son вне форума Ответить с цитированием
Старый 07.07.2009, 10:26   #2
mutabor
Телепат с дипломом
Старожил
 
Аватар для mutabor
 
Регистрация: 10.06.2007
Сообщений: 4,929
По умолчанию

Bitmap1.Assign(Bitmap2);
The future is not a tablet with a 9" screen no more than the future was a 9" black & white screen in a box. It’s the paradigm that survives. (Kroc Camen)
Проверь себя! Онлайн тестирование | Мой блог
mutabor вне форума Ответить с цитированием
Старый 07.07.2009, 10:33   #3
Son
Пользователь
 
Аватар для Son
 
Регистрация: 24.11.2008
Сообщений: 76
По умолчанию

А если мне необходимы преобразования над пикселями проводить? как тогда записывать данные в указатель?
Лучше сдохнуть, чем жить с иглой в яйце (Кащей Бессмертный)
Son вне форума Ответить с цитированием
Старый 07.07.2009, 10:47   #4
Son
Пользователь
 
Аватар для Son
 
Регистрация: 24.11.2008
Сообщений: 76
По умолчанию

мне нужно преобразовать битмап по пикселям. начал разбираться и что то не могу найти подходящего примера. как мне пробежать по пикселям и создать на основе создать новый битмат.
Лучше сдохнуть, чем жить с иглой в яйце (Кащей Бессмертный)
Son вне форума Ответить с цитированием
Старый 07.07.2009, 10:50   #5
mutabor
Телепат с дипломом
Старожил
 
Аватар для mutabor
 
Регистрация: 10.06.2007
Сообщений: 4,929
По умолчанию

Цитата:
Сообщение от Son Посмотреть сообщение
А если мне необходимы преобразования над пикселями проводить? как тогда записывать данные в указатель?
В указатель данные не записываются. Указатель нужно разименовать чтобы данные в объект писать. Но, при работе с битмапом указатели совсем не обязательно использовать, незачем.

Извлекайте сканлайном строки и преобразуйте, или попиксельно, как удобнее, но сканлайн быстрее.

Код:
procedure TForm1.Button2Click(Sender: TObject);
var b1,b2:TBitmap;
    x,y,w,h:integer;
    pb1,pb2:PDWORD; //я другого типа переменную использовал, не помню какого уже
    c:PRGBQuad;
begin
b1:=TBitmap.Create; //не забудьте память потом освободить (метод Free)
b2:=TBitmap.Create;
if (OpenPictureDialog1.Execute) and 
(FileExists(OpenPictureDialog1.FileName)) then //это лишнее, если диалог сработал, то файл существует
  begin
  b1.LoadFromFile(OpenPictureDialog1.FileName);
  w:=b1.Width;
  h:=b1.Height;
  b2.Width:=w;
  b2.Height:=h;
  for y:=0 to h-1 do
    begin
    pb1:=b1.ScanLine[y]; 
    pb2:=b2.ScanLine[y];
    for x:=0 to w-1 do
      begin
      c:=PRGBQuad(pb1);
      inc(pb1,4); //почему 4? 3 байта один 24-х битный пиксель занимает в строке
//к тому же правильнее x перемножать на 3, ну и опять же другой тип pb1 тут нужен
      pb2^:=DWord(c); //тут указатель не нужен
      inc(pb2,4);
      end;
    end;
  end;
end;
Вобщем я для примера сейчас приведу код рабочий, а вы уже свой переделайте.

Вот код эффекта антиалиас, в нем используется сканлайн, для 24-х битного битмапа, код рабочий
Код:
procedure ApplyFilter(var Source: TBitmap; XOrigin, YOrigin,
  XFinal, YFinal: Integer); stdcall;
var Memo,x,y: Integer;
    p0,p1,p2:pbytearray;
begin
   if XFinal<XOrigin then begin Memo:=XOrigin; XOrigin:=XFinal; XFinal:=Memo; end;
   if YFinal<YOrigin then begin Memo:=YOrigin; YOrigin:=YFinal; YFinal:=Memo; end;
   XOrigin:=max(1,XOrigin);
   YOrigin:=max(1,YOrigin);
   XFinal:=min(Source.width-2,XFinal);
   YFinal:=min(Source.height-2,YFinal);
   Source.PixelFormat :=pf24bit;
   for y:=YOrigin to YFinal do begin
    p0:=Source.ScanLine [y-1];
    p1:=Source.scanline [y];
    p2:=Source.ScanLine [y+1];
    for x:=XOrigin to XFinal do begin
      p1[x*3]:=(p0[x*3]+p2[x*3]+p1[(x-1)*3]+p1[(x+1)*3])div 4;
      p1[x*3+1]:=(p0[x*3+1]+p2[x*3+1]+p1[(x-1)*3+1]+p1[(x+1)*3+1])div 4;
      p1[x*3+2]:=(p0[x*3+2]+p2[x*3+2]+p1[(x-1)*3+2]+p1[(x+1)*3+2])div 4;
      end;
   end;
end;
Цитата:
мне нужно преобразовать битмап по пикселям. начал разбираться и что то не могу найти подходящего примера. как мне пробежать по пикселям и создать на основе создать новый битмат.
Самое простое решение, не долго думая, создайте сразу новый битмап, скопируйте с помощью Assign в него исходный битмап, и уже в новом преобразуйте строки. А вообще тут способов несколько есть это сделать, можно и построчно переносить в новый, пробуйте.
The future is not a tablet with a 9" screen no more than the future was a 9" black & white screen in a box. It’s the paradigm that survives. (Kroc Camen)
Проверь себя! Онлайн тестирование | Мой блог

Последний раз редактировалось mutabor; 07.07.2009 в 11:12.
mutabor вне форума Ответить с цитированием
Старый 07.07.2009, 11:23   #6
Son
Пользователь
 
Аватар для Son
 
Регистрация: 24.11.2008
Сообщений: 76
По умолчанию

Большое спасибо. код работает. С принципом разобрался)))
Лучше сдохнуть, чем жить с иглой в яйце (Кащей Бессмертный)
Son вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Копировать текст из webbrowser в memo (включить ctrl+c ctrl+v) копировать - вставить Alar Работа с сетью в Delphi 13 12.07.2010 18:16
копировать папку? Betty Общие вопросы Delphi 1 23.06.2009 19:50
копировать EXE galaid Паскаль, Turbo Pascal, PascalABC.NET 6 19.04.2009 13:09
Bitmap? HunterMan Общие вопросы .NET 7 27.12.2008 19:02
Icon to Bitmap Altera Мультимедиа в Delphi 3 23.04.2008 15:15