Главная страница
    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.49 MB
Время: 0.041 c
8-1164092727
acyb
2006-11-21 10:05
2007.09.09
delphi + скриншот + белый экран


15-1187014026
Kerk
2007-08-13 18:07
2007.09.09
У кого-нить тут есть аккаунт на epassporte?


15-1186824779
Delqq
2007-08-11 13:32
2007.09.09
directxgraphics


2-1187038679
Roman_Kesh
2007-08-14 00:57
2007.09.09
Работа с SaveDialog


2-1187526149
Тимофей_ка
2007-08-19 16:22
2007.09.09
почему то происходит обращение к удаленному Shape





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