Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Помогите с арифметикой


Вася ©   (2013-09-30 11:02:00) 

Функция поворота на 270 градусов изображения, при выполнении указатель чего-то вылазит за границы RawImage, как его правильно повернуть?
function RotateBMP270(aBitMap: TBitMap):TBitmap;    //поворот на 270*
var
x, y:integer;
pix3in, pix3out : ^TRGBtriple;
pix_p:Pointer;
begin
   result:=Tbitmap.Create;
   result.Assign(aBitMap);
   result.Width:=aBitMap.Height;
   result.Height:=aBitMap.Width;
   pix_p:=result.RawImage.data;
   pix3in:=pix_p;
   pix_p:=aBitMap.RawImage.Data;
   pix3out:=pix_p;
   result.BeginUpdate(false);
for x:=0 to aBitMap.Width-1 do
for y:=1 to aBitMap.Height-1 do
begin
 inc(pix3out, y*aBitMap.Width-y*x);
 pix3in^:=pix3out^;
 inc(pix3in);
end;
result.EndUpdate(false);
end;                      


RWolf   (2013-10-01 10:04:00) [1]

Проще использовать свойство Scanline.


MBo   (2013-10-01 07:10:00) [2]

http://en.wikipedia.org/wiki/BMP_file_format#Pixel_storage


MBo   (2013-10-01 06:30:00) [3]

>подозреваю дело в выравнивании, как правильно работать с такими картинками?
Учесть выравнивание


Вася   (2013-09-30 20:18:00) [4]

Еще засада, Есть картинки, в которых aBitMap.RawImage.DataSize != aBitMap.Height*aBitMap.Width*3(для 24-битных битмапов) aBitMap.RawImage.DataSizeбольше примерно на 2-3 кб в зависимости от размера картинки, подозреваю дело в выравнивании, как правильно работать с такими картинками?


Sha   (2013-09-30 19:44:00) [5]

> из всего многообразия выбрал 8 неправильных вариантов.

из многообразия поворотов на 270 градусов?


Inovet   (2013-09-30 15:10:00) [6]

> [10] [ВладОшин] ©   (30.09.13 14:38)
> а где еще 4 нашлось?

А перевернуть?


[ВладОшин]   (2013-09-30 14:39:00) [7]

а.. в другую сторону


[ВладОшин]   (2013-09-30 14:38:00) [8]


> Туповатый ©   (30.09.13 14:32) [9]
>
>

а где еще 4 нашлось? (90,180,270,360(0))


Туповатый   (2013-09-30 14:32:00) [9]


> Sha ©   (30.09.13 14:07) [8]

неправильно повернул, значит. из всего многообразия выбрал 8 неправильных вариантов.


Sha   (2013-09-30 14:07:00) [10]

> Вырежи квадрат из бумаги,
> поверни и попробуй вписать его в неповёрнутый квадрат.

нормально вписался ))


Вася   (2013-09-30 11:34:00) [11]

извините господа, перед inc(pix3out, y*aBitMap.Width-y*x);нужно было обнулить указатель, забыл


Плохиш   (2013-09-30 11:32:00) [12]


> Вася   (30.09.13 11:23) [3]
> ну вроде ж высоту и ширину поменял местами:

Ты на бумажке уже потренировался?


RWolf   (2013-09-30 11:32:00) [13]


> Ну да, считывает колонку исходного битмапа

Так задумано. А на деле что?


[ВладОшин]   (2013-09-30 11:30:00) [14]

Может, округленно получается при нецелочисленных операциях (погрешность) и она "вылазиет" потом
Если увеличить на несколько пикселов (и W, и H) результат - получается?


Вася   (2013-09-30 11:23:00) [15]

ну вроде ж высоту и ширину поменял местами:
result.Width:=aBitMap.Height;
result.Height:=aBitMap.Width;



> как-то подозрительно этот указатель скачет, явно не по строкам.

Ну да, считывает колонку исходного битмапа и записывает как строку результирующего


RWolf   (2013-09-30 11:17:00) [16]

> inc(pix3out, y*aBitMap.Width-y*x);
как-то подозрительно этот указатель скачет, явно не по строкам.


Плохиш   (2013-09-30 11:15:00) [17]


> Вася   (30.09.13 11:02)

> при выполнении указатель чего-то вылазит за границы RawImage

Так размеры для результата надо задавать с учётом повёрнутого изображения.
Вырежи квадрат из бумаги, поверни и попробуй вписать его в неповёрнутый квадрат.


Наверх

Титульная страница Поиск, карта сайта Написать письмо