Форум: "Основная";
Текущий архив: 2003.08.25;
Скачать: [xml.tar.bz2];
ВнизImage Resampling Найти похожие ветки
← →
TButton (2003-08-10 21:57) [0]ввиду отсутствия фотошопы и нехватки диского пространства, для сабжа пришлось ваять програмулю (качать здесь http://marcuch.narod.ru/ImEdit.exe 428Кб). С маленькими пиктами, которые я и использовал для обкатки/тестирования в ходе написания кода, все получалось идеально, а вот с пиктами по больше возникают косяки. Прога ресэмплит картинку процентов до 40-60 (в зависимости от размера) нормально (в смысле проценты выполнения ресэмплинга), а потом - обрыв и выдает мне не законченый результат...
догадываюсь, что понять то что я объясняю не легко, поетому предлагаю скачать и посмотреть, сырцы есть тут - http://marcuch.narod.ru/source.exe 38Кб архив.
← →
TButton (2003-08-10 21:58) [1]для тех кому интересно - кусок кода
procedure TForm2.Button1Click(Sender: TObject);
var
i,j,k:integer;
buf,samp:array of TColor;
c:TColor;
res1,res2:TBitMap;
begin
// самое сложное :) билинейный ресэмплинг
// создаем результативный имадж
res1:=TBitMap.Create;
res1.Height:=oldH;
res1.Width:=newW;
// и гаугу чтоб люди не нервничали
gauge1.MaxValue:=oldH+oldW-1;
gauge1.Progress:=0;
gauge1.Visible:=true;
// шаг первый ресэмплим строки
// строка это то что вдоль оси Х, поетомy перебираем Y
for i:=0 to oldH-1 do
begin
// создаем строку длинны oldW*newW
SetLength(buf,oldW*newW);
// заполняем ее, копируя соотв. строку из имаджа
for j:=0 to high(buf) do
begin
buf[j]:=Form1.image.Canvas.Pixels[j div newW,i];
end;
// рисуем строку на результативном имадже усредняя цвета
for j:=0 to newW-1 do
begin
SetLength(samp,oldW);
for k:=0 to oldW-1 do
samp[k]:=buf[j*oldW+k];
c:=AverColors(samp);
res1.Canvas.Pixels[j,i]:=c;
end;
gauge1.Progress:=gauge1.Progress+1;
gauge1.Repaint;
end;
// создаем второй имадж
res2:=TBitMap.Create;
res2.Height:=newH;
res2.Width:=newW;
// шаг второй. ресэмплим столбцы
// столбец это то что вдоль оси Y, поетомy перебираем Х
for i:=0 to oldW-1 do
begin
// создаем столбец высоты oldH*newH
SetLength(buf,oldH*newH);
// заполняем его, копируя соотв. столбе из имаджа полученого при прошлом ресэмпле
for j:=0 to high(buf) do
begin
buf[j]:=res1.Canvas.Pixels[i,j div newW];
end;
// рисуем столбец на результативном имадже усредняя цвета
for j:=0 to newH-1 do
begin
SetLength(samp,oldH);
for k:=0 to oldH-1 do
samp[k]:=buf[j*oldH+k];
c:=AverColors(samp);
res2.Canvas.Pixels[i,j]:=c;
end;
gauge1.Progress:=gauge1.Progress+1;
gauge1.Repaint;
end;
// убираем гаугу
gauge1.Visible:=false;
Form1.image.Height:=newH;
Form1.image.Width:=newW;
Form1.image.Canvas.Draw(0,0,res2);
Form1.plane.Height:=newH;
Form1.plane.Width:=newW;
Form1.planePaint(nil);
res1.free;
res2.free
end;
← →
TButton (2003-08-11 00:40) [2]чо-т мне кажется никто с такой траблой не сталкивался...
← →
TButton (2003-08-11 01:26) [3](: верите-нет я ошибку нашел... я не принял во внимание то что прога глючила тока на прямоугольных картинках :)
// создаем столбец высоты oldH*newH
SetLength(buf,oldH*newH);
// заполняем его, копируя соотв. столбе из имаджа полученого при прошлом ресэмпле
for j:=0 to high(buf) do
begin
buf[j]:=res1.Canvas.Pixels[i,j div new W];
end;
правильно будет:
// создаем столбец высоты oldH*newH
SetLength(buf,oldH*newH);
// заполняем его, копируя соотв. столбе из имаджа полученого при прошлом ресэмпле
for j:=0 to high(buf) do
begin
buf[j]:=res1.Canvas.Pixels[i,j div new Н];
end;
если кому интересна прога то вскоре она будет (в исправленом виде) там же...
← →
Омлет (2003-08-11 01:43) [4]Знаешь что такое ScanLine?
← →
TButton (2003-08-11 16:02) [5]нет... помоему метод канвы, но мне он не поможет...
← →
MBo (2003-08-11 16:06) [6]>помоему метод канвы, но мне он не поможет
;)
Лучше пусть комп полчаса кряхтит над Pixels ;)
С нормальным обращением к картинке тебе никие gauge не понадобятся
← →
TButton (2003-08-11 16:22) [7]лана... пошел штудировать хелп...
← →
MBo (2003-08-11 16:25) [8]А потом в Статьи загляни
← →
TButton (2003-08-11 16:28) [9]Provides indexed access to each line of pixels.
property ScanLine[Row: Integer]: Pointer;
Description
ScanLine is used only with DIBs (Device Independent Bitmaps) for image editing tools that do low-level pixel work.
чудно... ета фигулина возвращает поинтер. поинтер на что? непонятно. не понятно как ета фигулина может мне помочь...
← →
Skier (2003-08-11 16:37) [10]>TButton © (11.08.03 16:28) [9]
> чудно... ета фигулина возвращает поинтер. поинтер на что?
> непонятно
К этой "фигулине" пример есть.
Там всё вполне прозрачно. Посмотри.
← →
TButton (2003-08-11 17:00) [11]другого ответа я и не ожидал, у меня и мысли не было что кто-то скажет просто : "ета фигулина возращает поинтер на такую-то фигулину", поетому будем разбирать "прозрачный пример"
procedure TForm1.Button1Click(Sender: TObject);
// This example shows drawing directly to the BitMap
var
x,y : Integer;
BitMap : TBitMap;
P : PByteArray;
begin
BitMap := TBitMap.create;
try
BitMap.LoadFromFile("..\Images\Splash\256color\factory.bmp");
for y := 0 to BitMap.height -1 do
begin
P := BitMap.ScanLine[y];
for x := 0 to BitMap.width -1 do
P[x] := y;
end;
Canvas.draw(0,0,BitMap);
finally
BitMap.free;
end;
end;
1. создали битмапу
2. загрузили файлик
3. попер цикл
3.1. переменной типа РByteArray присваивают етот самый скан.
3.2. потом в етот байт-массив вписывают значение y (зачем???)
4. рисуют на форме битмапу
5. убивают битмапу
а теперь вопрос нафик они все ето делали и что получили. точно знаю что с битмапой ничего не сделалось. и потом какое отношение это имеет к моей проге?... т.е. мне сначало сканом выдернуть строку/столбец а потом перегонять ее в буфер?
← →
[lamer]Barmaglot (2003-08-11 17:06) [12]Скорость работы через пиксель и сканлан различны...
← →
TButton (2003-08-11 18:40) [13]вот уж что не ожидал услышать... ;)
← →
Fenik (2003-08-11 19:04) [14]Посмотри мои примерчики здесь:
http://delphibase.endimus.com/?action=viewtopic&topic=mediaimg
← →
Dmk (2003-08-12 01:07) [15]В общем запустил я твою программу.
Взял BMP 320x200, назначил 50% и ждал минут 5 :)
И это на P4 2.53GHz !!!!
К сведению: мой ресемплер с tif"ом
размером в 346Mb делает это за 6.63 сек.
Хотя может ты прикололся? =)
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2003.08.25;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.01 c