![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Помогите с арифметикой
Вася © (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
Так размеры для результата надо задавать с учётом повёрнутого изображения.
Вырежи квадрат из бумаги, поверни и попробуй вписать его в неповёрнутый квадрат.