Форум: "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.057 c