Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.03.23;
Скачать: CL | DM;

Вниз

Поворот изображений   Найти похожие ветки 

 
BMouradov   (2007-08-03 10:15) [0]

Посоветуйте библиотеку или модуль для поворота изображений в KOL. Или подскажите vcl-модуль, который было бы несложно переделать в KOL.


 
Vladimir Kladov   (2007-08-03 10:47) [1]

На сколько поворот? На 90*n - TBitmap. Для других имеет смфсл использовать 3D-ускоритель системы OGL12 вполне достаточно, даже без OpenGLContext.


 
Dimaxx ©   (2007-08-06 14:07) [2]

Вот тут у мну есть модуль на Си. Сам алгоритм описан довольно неплохо. Дума, перевести его на Паскаль несложно. Но он DOSовский, т.е. непосредственно обращается к памяти.

Вpащение pастpовой каpтинки

Алгоритм достаточно подробно объяснен в виде комментариев.

#include <dos.h>
#include <alloc.h>
#include <fcntl.h>
#include <io.h>
#include <mem.h>
#include <math.h>

typedef struct {
char              bfType[2];
unsigned long     bfSize;
unsigned long     bfReserved;
unsigned long     bfOffBits;

unsigned long     biSize;
unsigned long     biWidth;
unsigned long     biHeight;
unsigned int      biPlanes;
unsigned int      biBitCount;
unsigned long     biCompression;
unsigned long     biSizeImage;
unsigned long     biXPelsPerMeter;
unsigned long     biYPelsPerMeter;
unsigned long     biClrUsed;
unsigned long     biClrImportant;

struct {
  unsigned char rgbBlue;
  unsigned char rgbGreen;
  unsigned char rgbRed;
  unsigned char rgbReserved;
} bmiColors[256];

} TBMPFileHeader;

typedef unsigned char Row[320];

main(argc,argv)
int argc;
char **argv;
{
Row            *screen = MK_FP(0xA000,0),
               *picture,
               *buffer;

int            BMP;
TBMPFileHeader header;

unsigned       x,y,i,
               xp,yp;

long           x0,y0,
               xdx,xdy,
               ydx,ydy,
               x1,y1;

double         A, SinA, CosA, scale;

int            r,g,b, black, black_bri, bri;

if ( argc<2 ||
     (picture = malloc(64000)) == NULL ||
     (buffer = malloc(64000)) == NULL )
  return(1);

// читаем каpтинкy из 256-цветного *.BMP файла с pазмеpом
// изобpажения 320x200
// и без использования компpессии. Размеp файла должен быть
// 65078 байт.

BMP = open(argv[1], O_RDONLY | O_BINARY);
read(BMP,&header,sizeof(header));
read(BMP,buffer,64000);
close(BMP);

// пеpеходим в гpафический pежим 13h
_AX=0x13;
geninterrupt(0x10);

// изменяем палитpy и находим самый чеpный цвет
black_bri=32767; // яpкость самого чеpного из найденных цветов
outportb(0x3c8,0);
for (i=0; i<256; i++) {
   r=header.bmiColors[i].rgbRed >> 2;
   g=header.bmiColors[i].rgbGreen >> 2;
   b=header.bmiColors[i].rgbBlue >> 2;
   outportb(0x3c9, r);
   outportb(0x3c9, g);
   outportb(0x3c9, b);
   bri=r*r+g*g+b*b; // яpкость текyщего цвета
   if (bri<black_bri) {
     black_bri=bri;
     black=i; // самый чеpный из найденных цветов
   }
}
_AX=0x1001; // окpашивем боpдюp в чеpный цвет
_BH=black;
geninterrupt(0x10);

// в файле стpоки хpанились в обpатном поpядке, их необходимо
// пеpеставить

for (y=0; y<200; y++)
  memcpy(picture[y],buffer[199-y],320);

// вpащаем каpтинкy
for (A=0.0; inportb(0x60)!=0x01; A+=0.03) {//пока не нажали ESCAPE

   scale=1.0/(1.0+0.2*cos(A*4.0)); //коэффициент yвеличения каpтинки
   SinA=sin(A);
   CosA=cos(A);
   // какyю точкy каpтинки надо изобpажать в веpхней левой точке
// экpана?
   // (использyются вычисления с фиксиpованной точкой в фоpмате
//  16.16)
   x0= (160.0+scale*(-160.0*CosA+100.0*1.2*SinA))*65536.0;
   y0= (100.0+scale*(-100.0*CosA-160.0*SinA/1.2))*65536.0;
   // на сколько надо сместиться по каpтинке пpи пеpемешении
// по экpанy
// на пиксель влево
   xdx = scale*CosA*65536.0;
   xdy = scale*SinA*65536.0/1.2;

   // на пиксель вниз
   ydx = -scale*SinA*65536.0*1.2;
   ydy = scale*CosA*65536.0;

   for (y=0; y<200; y++) {
    // x0, y0 - кооpдинаты на каpтинке начала текyщей стpоки
 // сканиpования
    // x1, y1 - кооpдинаты на каpтинке текyщей pисyемой точки
    x1 = x0;
    y1 = y0;
    for (x=0; x<320; x++) {
     // xp, yp - кооpдинаты на каpтинке текyщей pисyемой точки
  // (фоpмат 16:0)
     xp = x1 >> 16;
     yp = y1 >> 16;
     // "клиппинг"
     if (/*xp>=0 &&*/ xp<=319 && /*yp>=0 &&*/ yp<=199)
  // Т.к. они unsigned
        buffer[y][x]=picture[yp][xp];
     else
        buffer[y][x]=black;
     // пеpедвижение вдоль стpоки сканиpования
     x1+=xdx;
     y1+=xdy;
    }
    // пеpеход к новой стpоке сканиpования
    x0+=ydx;
    y0+=ydy;
   }

   // изобpажаем на экpане и еще немножко повоpачиваем
   memcpy(screen,buffer,64000);
};

_AX=0x03;
geninterrupt(0x10);

free(buffer);
free(picture);
return(0);
}


 
Vladimir Kladov   (2007-08-06 18:24) [3]

Это будет поворот со значительным ухудшением качества, и довольно медленный. Как вариант, с использованием предварительного увеличения, затем уменьшения после поворота с halftone - прокатит по качеству, но будет ещё медленнее.


 
homm ©   (2007-08-06 21:17) [4]

> затем уменьшения после поворота с halftone - прокатит по
> качеству, но будет ещё медленнее.

можно использовать BitmapAntialias4X и BitmapAntialias2X из модуля KOLGRushControls, в разы быстрее.



Страницы: 1 вся ветка

Текущий архив: 2008.03.23;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.013 c
4-1185701082
emfs
2007-07-29 13:24
2008.03.23
размеры рабочего стола


2-1203588470
oleg_teacher
2008-02-21 13:07
2008.03.23
Свое расширение на файл.


15-1202569817
korstin
2008-02-09 18:10
2008.03.23
Нынче заказчики пошли )))


2-1203717911
Res
2008-02-23 01:05
2008.03.23
чат


8-1177944957
Nikss
2007-04-30 18:55
2008.03.23
OpenGL