|
#1
|
|||
|
|||
Bitmap
Доброго времени суток всем!
Никак не могу разобраться. Загружаю изображения из файла в один 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; //рисуем на форму Оставайтесь хорошими людьми... VK id2634397, ds [at] phoenix [dot] dj |