Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "KOL";
Текущий архив: 2008.03.23;
Скачать: [xml.tar.bz2];

Вниз

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

 
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 вся ветка

Форум: "KOL";
Текущий архив: 2008.03.23;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.009 c
2-1204008733
031178
2008-02-26 09:52
2008.03.23
Календарик в Delphi


15-1202459218
boriskb
2008-02-08 11:26
2008.03.23
Рекомендую новый антивирус


2-1203580401
aleyna
2008-02-21 10:53
2008.03.23
паралельно


4-1178650355
Strate
2007-05-08 22:52
2008.03.23
Опять ListView, изменение колонки.


15-1202698088
Dmitry S
2008-02-11 05:48
2008.03.23
Вопрос про ООП





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский