![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
работа с BMP-файлом [D6, Win95/98, WinXP]
Ghost_1980 © (2004-12-14 00:38:00)Есть загруженый в Image BMP-файл. Необходимо получить цвет каждой точки и изменить ее цвет...в общем случае на любой другой. Если не сложно, то прокоментируйте все моменты процедуры.
Прошу прощения, если это все очень просто, но только начал разбираться с Делфи и возник такой вот вопрос.
Mihey_temporary (2004-12-15 01:12:00) [1]
> т.е. что то вроде этого:
> for y:=1 to Image1.Height do
> for x:=1 to Image1.Width do
> begin
> MyA[y,x]:=Image1.Picture.Bitmap.Canvas.Pixels[x,y];
> Image1.Picture.Bitmap.Canvas.Pixels[x,y]:=OtherColor;
> end;
> или как? где я не прав???
for y := 0to Image1. Picture.Bitmap.Height -1do
for x:= 0to Image1. Picture.Bitmap.Width -1do
begin
MyA[ x,y]:=Image1.Picture.Bitmap.Canvas.Pixels[x,y];
Image1.Picture.Bitmap.Canvas.Pixels[x,y]:=OtherColor;
end;
Ghost_1980 (2004-12-15 00:32:00) [2]т.е. что то вроде этого:
for y:=1 to Image1.Height do
for x:=1 to Image1.Width do
begin
MyA[y,x]:=Image1.Picture.Bitmap.Canvas.Pixels[x,y];
Image1.Picture.Bitmap.Canvas.Pixels[x,y]:=OtherColor;
end;
или как? где я не прав???
Mihey_temporary (2004-12-14 23:34:00) [3]
> Ghost_1980 (14.12.04 19:51) [4]
Этот код работает нормально, я лично убеждался. Я проверил на маленьком битмапе 32х32.
Mihey_temporary (2004-12-14 23:33:00) [4]
> А можно ли узнать где начинается изображение?
В смысле? Когда ты обращаешься к TImage.Picture.Bitmap, ты обращаешься к растру, который не обязательно на экране. У него нет координат. Он висит в памяти и с него TImage выводит на свою канву изображение уже в зависимости от своих координат. Т.е. независимо от Centered = True или False, TImage.Picture.Bitmap.Canvas.Pixels надо считать от начала самого изображения (а не от рамок TImage).
Ghost_1980 (2004-12-14 23:13:00) [5]А можно ли узнать где начинается изображение?
Mihey_temporary (2004-12-14 21:05:00) [6]-1 - значит координаты вне изображения.
Ghost_1980 (2004-12-14 19:51:00) [7]У меня в программе реализовано следуещее:
...
if(OpenPictureDialog1.Execute=true) then
Image1.Picture.Bitmap.LoadFromFile(OpenPictureDialog1.FileName);
...
var
MyColor:integer;
OtherColor:integer;
x,y:integer;
begin
x:=10;
y:=10;
OtherColor:=0;
MyColor:=Image1.Picture.Bitmap.Canvas.Pixels[x,y];
Image1.Picture.Bitmap.Canvas.Pixels[x,y]:=OtherColor;
в MyColor -1.
рисунок небольшой, расположен по центру Image1.
Что я делаю неправильно?
Mihey_temporary (2004-12-14 18:46:00) [8]
> хммм...попробую все способы рассмотреть...
> да..еще такой вопрос...сохранение в файл измененного bmp-файла
> производить обычным диалогом сохранения?
> какую информацию о bmp-файле можно узнать? не подскажите
> ли функции и примеры их работы?
Сохранение BMP через метод TBitmap.SaveToFile, а уж право оформлять это в диалог вы оставляете за собой.
Информвцию о BMP можно узнать разную и опять-таки, в зависимости от того, как узнавать. Если загрузить в TBitmap растр, то далее узнаём ширину, высоту, PixelFormat, палитру (если есть) обычными способами через свойства класса. Если требуется быстро узнавать только информацию о BMP и не требуется загружать его всего, то придётся напрямую считывать заголовки (это не так уж и сложно). Кроме того, можно узнать расчётную информацию, например, количество уникальных цветов.
Ghost_1980 (2004-12-14 01:23:00) [9]хммм...попробую все способы рассмотреть...
да..еще такой вопрос...сохранение в файл измененного bmp-файла производить обычным диалогом сохранения?
какую информацию о bmp-файле можно узнать? не подскажите ли функции и примеры их работы?
Mihey_temporary (2004-12-14 01:15:00) [10]Для одиночного доступа пойдёт и:
MyColor := Image1.Picture.Bitmap.Canvas.Pixels[x,y];
Image1.Picture.Bitmap.Canvas.Pixels[x,y] := OtherColor;
Но этот способ медленный, поэтому рекомендуем:
http://www.efg2.com/Lab/ImageProcessing/Scanline.htm
http://www.delphimaster.ru/articles/pixels/index.html