![]() |
|
|
#1
|
|||
|
|||
|
Доброго времени суток всем!
Никак не могу разобраться. Загружаю изображения из файла в один TBitmap, затем копирую в другой и при этом теряется цветность изображения (когда вывожу на канвас из второго битмапа). Причем если вывожу на канву из первого то всё нормально. Так же если во второй гружу из файла и потом на канву тоже нормально. В чем может быть загвоздка. |
|
#2
|
||||
|
||||
|
А как копируешь? Палитру тож копировать надо.
|
|
#3
|
|||
|
|||
|
Копирую просто заданием области копирования и
BitMap.Canvas.CopyRect(RD,B1.Canvas,RS); либо BitMap.Canvas.Draw(0,0,B1); результат один и тот же. Причем подобный эффект происходит только при задании свойства PixelFormat для обоих битмапов в pf4bit. Если поставить pf16bit и выше то всё нормально. А как правильно скопировать палитру? Я устаноавливаю для второго битмапа BitMap.Canvas.CopyMode:=cmSrcCopy; Это не обеспечивает копирование палитры? |
|
#4
|
|||
|
|||
|
Но если установить выше чем pf4bit сильно растет размер
|
|
#5
|
||||
|
||||
|
Сделай:
Код:
Bitmap2.Assign(Bitmap1); |
|
#6
|
|||
|
|||
|
Да тут не так просто. Дело в том что я копирую из множества битмапов в один. Т.е. из фрагментов карты составляю одну, а потом вывожу её на канву. Поэтому каждму фрагменту соответствуюет свой битмап, которые в свою очередь копируются в один общий большой.
|
|
#7
|
|||
|
|||
|
Если копировать палитру при копировании каждого битмапа в общий, то качество все равно теряется.
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
|
||||
|
||||
|
Попробуй не копировать, а рисовать на некий контекст.
|
|
#9
|
|||
|
|||
|
т.е. юзать BitMap.Canvas.Draw?
|
|
#10
|
||||
|
||||
|
Не, я имел в виду BitBlt
|
|
#11
|
|||
|
|||
|
А вообще, проконсультируйте, по правильному пути я пошел. Т.е. задача такая, из фрагментов карт (имеющих привязку к гео координатам), каждый из которых сохранен в отдельном растре (не важно bmp, jpeg и т.д.), нужно сделать одну общую и вывести пользователю. Я пошел по такому пути, каждый фрагмент загружаю в свой Bitmap, потом составляю из фрагментов карту в Bitmap'е буфере и вывожу на канвас PaintBox'а. Правильно?
|
|
#12
|
|||
|
|||
|
Т.е. никто не знает?
|
|
#13
|
|||
|
|||
|
А вообще проблема так и не решилась. При копировании из одного 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;при этом если сохранить в файл B1 он будет отличного качества, а BitMap уже плохого. Очень сильная потеря цветности и качества. Проблема как то решается если у BitMap.PixelFormat задать pf16bit и выше, но при этом изображение раздувается по размеру и вывод на канвас (перерисовка) тормозит. А иногда (при больших размерах исходного изображения) приложение вываливается "Недостаточно памяти...". Кто соображает в графике, помогите пожалуйста. Даже не знаю в какую сторону искать. ![]() Последний раз редактировалось Admin, 04.06.2009 в 10:26. |
|
#14
|
|||
|
|||
|
Люди, объясните пожалуйста, никто не знает ответов на подобные вопросы или просто ответ писать влом? Вообще какой то мертвый форум... Столько вопросов без ответа (я имею ввиду и не только мой вопрос). Подскажите хоть кто нибудь тогда ответ на такой вопрос, есть какой нибудь форум где поактивней помогают разбираться с возникшими трудностями? Где тусуются все опытные программисты (здесь похоже их нет
)? Дайте ссылку пожалуйста? |
|
#15
|
||||
|
||||
|
Тупая идея, чисто пальцем в небо, но именно так я достиг однажды результата:
Код:
BitMap.PixelFormat:=pf16bit; //копируем, рисуем и тд... BitMap.PixelFormat:=pf4bit; //рисуем на форму |