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

Вниз

копирование круглой области   Найти похожие ветки 

 
drnet_ua   (2006-11-30 18:19) [0]

вроде не нашел по поиску...

задача:
есть 4 картинки
необходимо каждую повернуть на некоторый угол
обрезать до формы круга
и их засунуть в результирующию в нужные координаты

картинки 160х160mm 4000dpi 1бит,результат прямоугольник, тоже 1бит. :) 610х341мм 4000dpi

обрезать до "круга" необходимо по тому что они ложатся почти в притык, и углами будут друг-друга перекрывать

примерный вид исходика и результата
http://www.drnet.com.ua/result.jpg
http://www.drnet.com.ua/source.jpg

т.е. вопросов даже 2:
1: "быстрые" способы поворота битмапа на произвольный угол
2: "быстрое" копирование круглой области

спасибо.


 
MBo ©   (2006-12-01 06:58) [1]

1. в инете полно
2. выбрать в контексте регион отсечения CreateEllipticRgn+SelectCLipRegion


 
drnet_ua   (2006-12-01 19:12) [2]

спасибо, с копированием разобрался

остался поворот :)

так-как углов поворота всего 4, был создан масив с разультатами вычислений для каждого агла и сохранен на диск. т.е. на вычислениях мы сэкономили.
но все-равно долго src.canvas.pixels[] := dst.canvas.pixels[]
может есть более продуктивный способ?


 
antonn ©   (2006-12-01 23:29) [3]

не использовать pixels[], а перейти на scanline.


 
MBo ©   (2006-12-02 13:01) [4]

>может есть более продуктивный способ?
в статьи загляни


 
DevilDevil ©   (2006-12-03 12:35) [5]

type
TColorArray = array[0..1024] of TColor;
PColorArray = ^TColorArray;

...
var
 ARR : PColorArray;
...
begin
...
 Bitmap.PixelFormat := pf32bit;
...
 ARR := Bitmap.Scanline[Y];
...

// <-- достаточно быстрый способ. Теперь ARR - это "массив", в котором содержится пиксели Битмапа в строке с координатой Y


 
drnet_ua   (2006-12-04 11:52) [6]

спасибо!

а если
PixelFormat := pf1bit
и размер битмапы не константен к примеру 236220х236220 ?


 
DevilDevil ©   (2006-12-04 13:54) [7]

1) если ты присваиваешь pf32bit, то битмап автоматически конвертируется.
2) Ты о константе 1024? Если да, то:
    константа значения не имеет. обычно пишут array[0..0] of
    но иногда необходимо цвет пикселя, например пятого. если написать Color := ARR[5], то мой вариант будет работать, а на [0..0] заругается компилятор. Обходится так: i := 5; Color := ARR[i];. Конкретно в твоём случае, наверное, можно и [0..0] обойтись


 
drnet_ua   (2006-12-04 18:57) [8]

мне pf32bit нелзя :) ибо размер у битмапы огромный

я так понял что для для 1бит это делается через pbytearray


 
DevilDevil ©   (2006-12-05 12:52) [9]

1) Это для pf8bit  -  pbytearray
2) У тебя чёрно-белые изображения что-ли?

Если да, то:

a) да, надо использовтаь pbytearray
b) не обойтись без:

procedure SetColor(Line : pbytearray; PixelN : integer; Color : boolean); // false-белый, true - чёрный
var
 B : pbyte;
begin
 B := @Line[PixelN div 8];
 PixelN := PixelN mod 8;

 if Color then
    B^ := B^ or (1 shl PixelN)
 else
    B^ := B^ and ( not(1 shl PixelN) );
end;

function GetColor(Line : pbytearray; PixelN : integer) : boolean;
begin
 Result := ( Line[PixelN div 8] and (PixelN mod 8) ) <> 0;
end;


 
drnet_ua   (2006-12-05 16:20) [10]

вот такое, но рисует что-попало :( причем совсем не понимаю где ошибка :(

// матрица соответствия
tar:Array of array of array [1..2] of integer;

function ScanCopy(src:TBitmap):TBitmap;
var i,j:integer;

srcScanLine,dstScanLine: pByteArray;
mask:array [0..7] of byte;
srcPixelByte,dstPixelByte:byte;
srcPixelBit:byte;
dstPixelBit:byte;
isPixel:byte;

begin
mask[0]:=1;
mask[1]:=mask[0]*2;
mask[2]:=mask[1]*2;
mask[3]:=mask[2]*2;
mask[4]:=mask[3]*2;
mask[5]:=mask[4]*2;
mask[6]:=mask[5]*2;
mask[7]:=mask[6]*2;

result:=TBitmap.Create;
result.Height:=src.Height;
result.Width:=src.Width;
result.PixelFormat:=pf1bit;
result.Palette:=src.Palette;

for i:=0 to result.Height-1 do begin
dstScanLine := pByteArray(result.scanline[i]);

  for j:=0 to result.width-1 do begin

       srcPixelByte:=tar[i][j][2] div 8;
       dstPixelByte:=j div 8;

       srcPixelBit:=tar[i][j][2] mod 8;
       dstPixelBit:=j mod 8;

       srcScanLine := pByteArray(src.scanline[tar[i][j][1]]);
       isPixel:=srcScanLine[srcPixelByte] and mask[srcPixelBit];
       if isPixel>0 then
       dstScanLine[dstPixelByte]:=dstScanLine[dstPixelByte] or mask[dstPixelBit];

end;

end;


 
DevilDevil ©   (2006-12-05 23:29) [11]

> drnet_ua   (05.12.06 16:20) [10]

1) я не пойму, у тебя изображение чёрно-белое что-ли? Почему PixelFormat = pf1bit?

2) Текст мне непонятен. Наверное, потому что поздно уже. Сначала советую перейти на pf32bit (TColorArray), или pf16bit (TWordArray) в крайнем случае pf8bit (TByteArray) и только потом пробовать с pf1bit. А какие размеры битмапов, сколько свободной памяти?


 
Думкин ©   (2006-12-06 07:00) [12]

Последовать совету
> MBo ©   (02.12.06 13:01) [4]
и таки найти статью по работе с изображениями - ниже нашего достоинства. Будем изобретать велосипед.


 
drnet_ua   (2006-12-06 09:52) [13]

Изображение 1бит, входные и результирующие - ТИФФ, 1Бит
размер примерно 23000х23000 (150мм 4000dpi)

Думкин - можно ссылочку?


 
Думкин ©   (2006-12-06 11:10) [14]

http://www.delphimaster.ru/articles/pixels/index.html


 
drnet_ua   (2006-12-06 18:11) [15]

2Думкин: спасибо, виноват :)

но велосипед все-таки придется выдумывать, только теперь на основе TQuickPixels
уж больно долго оно считает, надо быстрее. щаз буду заказывать 2xCore2 и раскидывать по потокам :(



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

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

Наверх




Память: 0.5 MB
Время: 0.02 c
15-1186835172
Kolan
2007-08-11 16:26
2007.09.09
Как добавить установку драйвера в инстолятор?


4-1174292317
Zserg
2007-03-19 11:18
2007.09.09
Создание дополнительного COM порта


2-1187073459
Megabyte
2007-08-14 10:37
2007.09.09
Работа через WinAPI с USB Web-камерой


3-1179096304
Gringoire
2007-05-14 02:45
2007.09.09
SQL запрос


15-1186924736
апр
2007-08-12 17:18
2007.09.09
User Gate