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

Вниз

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

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

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

Наверх




Память: 0.48 MB
Время: 0.04 c
15-1186756832
\/iKTOR
2007-08-10 18:40
2007.09.09
Улыбнитесь :)


2-1187415122
actis
2007-08-18 09:32
2007.09.09
Как описать выделение мышью на рисунке?


15-1186418494
alex_***
2007-08-06 20:41
2007.09.09
12 языков программирования, которые потрясли мир


2-1187068473
Новичек
2007-08-14 09:14
2007.09.09
Работа с USB портом.


4-1174460041
Asker
2007-03-21 09:54
2007.09.09
Программный скроллинг у TTreeView





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