Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Графика и игры
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 20.05.2009, 12:08
Alex_S_S Alex_S_S вне форума
Прохожий
 
Регистрация: 07.05.2009
Сообщения: 41
Репутация: 10
По умолчанию Bitmap

Доброго времени суток всем!

Никак не могу разобраться. Загружаю изображения из файла в один TBitmap, затем копирую в другой и при этом теряется цветность изображения (когда вывожу на канвас из второго битмапа). Причем если вывожу на канву из первого то всё нормально. Так же если во второй гружу из файла и потом на канву тоже нормально. В чем может быть загвоздка.
Ответить с цитированием
  #2  
Старый 20.05.2009, 12:29
Аватар для Aristarh Dark
Aristarh Dark Aristarh Dark вне форума
Модератор
 
Регистрация: 07.10.2005
Адрес: Москва
Сообщения: 2,906
Версия Delphi: Delphi XE
Репутация: выкл
По умолчанию

А как копируешь? Палитру тож копировать надо.
__________________
Некоторые программисты настолько ленивы, что сразу пишут рабочий код.

Если вас наказали ни за что - радуйтесь: вы ни в чем не виноваты.
Ответить с цитированием
  #3  
Старый 20.05.2009, 12:47
Alex_S_S Alex_S_S вне форума
Прохожий
 
Регистрация: 07.05.2009
Сообщения: 41
Репутация: 10
По умолчанию

Копирую просто заданием области копирования и
BitMap.Canvas.CopyRect(RD,B1.Canvas,RS);
либо
BitMap.Canvas.Draw(0,0,B1);
результат один и тот же.
Причем подобный эффект происходит только при задании свойства PixelFormat для обоих битмапов в pf4bit. Если поставить pf16bit и выше то всё нормально.
А как правильно скопировать палитру? Я устаноавливаю для второго битмапа BitMap.Canvas.CopyMode:=cmSrcCopy; Это не обеспечивает копирование палитры?
Ответить с цитированием
  #4  
Старый 20.05.2009, 12:52
Alex_S_S Alex_S_S вне форума
Прохожий
 
Регистрация: 07.05.2009
Сообщения: 41
Репутация: 10
По умолчанию

Но если установить выше чем pf4bit сильно растет размер
Ответить с цитированием
  #5  
Старый 20.05.2009, 13:22
Аватар для Aristarh Dark
Aristarh Dark Aristarh Dark вне форума
Модератор
 
Регистрация: 07.10.2005
Адрес: Москва
Сообщения: 2,906
Версия Delphi: Delphi XE
Репутация: выкл
По умолчанию

Сделай:
Код:
Bitmap2.Assign(Bitmap1);
__________________
Некоторые программисты настолько ленивы, что сразу пишут рабочий код.

Если вас наказали ни за что - радуйтесь: вы ни в чем не виноваты.
Ответить с цитированием
  #6  
Старый 20.05.2009, 13:38
Alex_S_S Alex_S_S вне форума
Прохожий
 
Регистрация: 07.05.2009
Сообщения: 41
Репутация: 10
По умолчанию

Да тут не так просто. Дело в том что я копирую из множества битмапов в один. Т.е. из фрагментов карты составляю одну, а потом вывожу её на канву. Поэтому каждму фрагменту соответствуюет свой битмап, которые в свою очередь копируются в один общий большой.
Ответить с цитированием
  #7  
Старый 21.05.2009, 06:03
Alex_S_S Alex_S_S вне форума
Прохожий
 
Регистрация: 07.05.2009
Сообщения: 41
Репутация: 10
По умолчанию

Если копировать палитру при копировании каждого битмапа в общий, то качество все равно теряется.

BitMap.Palette := B1.Palette;
BitMap.Canvas.CopyRect(RD,B1.Canvas,RS);

BitMap.Palette := B2.Palette;
BitMap.Canvas.CopyRect(RD,B2.Canvas,RS);

Облсти RD и RS естественно задаются перед копированием. Или может палитру как то не так нужно копировать
Ответить с цитированием
  #8  
Старый 21.05.2009, 14:12
Аватар для Aristarh Dark
Aristarh Dark Aristarh Dark вне форума
Модератор
 
Регистрация: 07.10.2005
Адрес: Москва
Сообщения: 2,906
Версия Delphi: Delphi XE
Репутация: выкл
По умолчанию

Попробуй не копировать, а рисовать на некий контекст.
__________________
Некоторые программисты настолько ленивы, что сразу пишут рабочий код.

Если вас наказали ни за что - радуйтесь: вы ни в чем не виноваты.
Ответить с цитированием
  #9  
Старый 21.05.2009, 14:59
Alex_S_S Alex_S_S вне форума
Прохожий
 
Регистрация: 07.05.2009
Сообщения: 41
Репутация: 10
По умолчанию

т.е. юзать BitMap.Canvas.Draw?
Ответить с цитированием
  #10  
Старый 21.05.2009, 18:15
Аватар для Aristarh Dark
Aristarh Dark Aristarh Dark вне форума
Модератор
 
Регистрация: 07.10.2005
Адрес: Москва
Сообщения: 2,906
Версия Delphi: Delphi XE
Репутация: выкл
По умолчанию

Не, я имел в виду BitBlt
__________________
Некоторые программисты настолько ленивы, что сразу пишут рабочий код.

Если вас наказали ни за что - радуйтесь: вы ни в чем не виноваты.
Ответить с цитированием
  #11  
Старый 22.05.2009, 05:36
Alex_S_S Alex_S_S вне форума
Прохожий
 
Регистрация: 07.05.2009
Сообщения: 41
Репутация: 10
По умолчанию

А вообще, проконсультируйте, по правильному пути я пошел. Т.е. задача такая, из фрагментов карт (имеющих привязку к гео координатам), каждый из которых сохранен в отдельном растре (не важно bmp, jpeg и т.д.), нужно сделать одну общую и вывести пользователю. Я пошел по такому пути, каждый фрагмент загружаю в свой Bitmap, потом составляю из фрагментов карту в Bitmap'е буфере и вывожу на канвас PaintBox'а. Правильно?
Ответить с цитированием
  #12  
Старый 25.05.2009, 11:43
Alex_S_S Alex_S_S вне форума
Прохожий
 
Регистрация: 07.05.2009
Сообщения: 41
Репутация: 10
По умолчанию

Т.е. никто не знает?
Ответить с цитированием
  #13  
Старый 04.06.2009, 08:01
Alex_S_S Alex_S_S вне форума
Прохожий
 
Регистрация: 07.05.2009
Сообщения: 41
Репутация: 10
По умолчанию

А вообще проблема так и не решилась. При копировании из одного Bitmap в другой происходит очень сильная потеря качества, если копирование происходит не методом Assign. Вот как делаю
Код:
B1 := TBitMap.Create;
B1.PixelFormat := pf4bit;
B1.Canvas.CopyMode:=cmSrcCopy;
B1.Monochrome := false;
B1.Transparent := false;

JpegIm := TJpegImage.Create;
JpegIm.LoadFromFile('какой то файл');
B1.Assign(JpegIm);
JpegIm.Destroy;

BitMAP := TBitMap.Create;
BitMap.PixelFormat := pf4bit;
BitMap.Monochrome := false;
BitMap.Transparent := false;

BitMap.Width := B1.Width;
BitMap.Height := B1.Height;

//BitMap.Palette := B1.Palette;                  //хоть так
BitMap.Palette := CopyPalette(B1.Palette);  //хоть так
BitMap.Canvas.CopyMode:=cmSrcCopy;

//пробовал копирование со всеми ниже перечисленными методами
//BitMap.Canvas.Draw(Round(RD.Left,RD.Top,B1);
//BitMap.Canvas.StretchDraw(RD,B1);
//BitMap.Canvas.CopyRect(RD,B1.Canvas,RS);
BitBlt(BitMap.Canvas.Handle, RD.Left, RD.Top, RD.Right, RD.Bottom, B1.Canvas.Handle, 0, 0, SRCCOPY);

B1.FreeImage;
B1.Destroy;
Admin: Пользуемся тегами!

при этом если сохранить в файл B1 он будет отличного качества, а BitMap уже плохого. Очень сильная потеря цветности и качества. Проблема как то решается если у BitMap.PixelFormat задать pf16bit и выше, но при этом изображение раздувается по размеру и вывод на канвас (перерисовка) тормозит. А иногда (при больших размерах исходного изображения) приложение вываливается "Недостаточно памяти...".

Кто соображает в графике, помогите пожалуйста. Даже не знаю в какую сторону искать.

Последний раз редактировалось Admin, 04.06.2009 в 10:26.
Ответить с цитированием
  #14  
Старый 08.06.2009, 17:41
Alex_S_S Alex_S_S вне форума
Прохожий
 
Регистрация: 07.05.2009
Сообщения: 41
Репутация: 10
По умолчанию

Люди, объясните пожалуйста, никто не знает ответов на подобные вопросы или просто ответ писать влом? Вообще какой то мертвый форум... Столько вопросов без ответа (я имею ввиду и не только мой вопрос). Подскажите хоть кто нибудь тогда ответ на такой вопрос, есть какой нибудь форум где поактивней помогают разбираться с возникшими трудностями? Где тусуются все опытные программисты (здесь похоже их нет )? Дайте ссылку пожалуйста?
Ответить с цитированием
  #15  
Старый 08.06.2009, 21:44
Аватар для PhoeniX
PhoeniX PhoeniX вне форума
Always hardcore!
 
Регистрация: 04.03.2009
Адрес: СПб
Сообщения: 3,239
Версия Delphi: GCC/FPC/FASM
Репутация: 62149
По умолчанию

Тупая идея, чисто пальцем в небо, но именно так я достиг однажды результата:
Код:
  BitMap.PixelFormat:=pf16bit;
  //копируем, рисуем и тд...
  BitMap.PixelFormat:=pf4bit;
  //рисуем на форму
возможно не совсем правильно с точки зрения программы, но может сработать.
__________________
Оставайтесь хорошими людьми...
VK id2634397, ds [at] phoenix [dot] dj
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 07:24.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter