Главная страница
    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.48 MB
Время: 0.047 c
2-1186858488
TStas
2007-08-11 22:54
2007.09.09
Описание ф-ции InternetGetConnectedState


2-1187473015
foreverDelphi
2007-08-19 01:36
2007.09.09
завершения конекта TServerSocket - stThreadBlocking


15-1187253664
vajo
2007-08-16 12:41
2007.09.09
Intel чоппер


15-1186513465
Cyrax
2007-08-07 23:04
2007.09.09
Проверка авторских прав на слово, составляющее доменное имя...


15-1186600345
anton773
2007-08-08 23:12
2007.09.09
службы виндовс





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский