Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.08.25;
Скачать: CL | DM;

Вниз

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;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.015 c
9-81525
Movelock
2003-02-22 11:18
2003.08.25
КАК ПОКАЗАТЬ НА ФОРМЕ МОДЕЛЬ из 3dmax


1-81619
DoNotKnow
2003-08-12 23:39
2003.08.25
Активация приложения


1-81647
Zorik
2003-08-12 12:06
2003.08.25
запихнуть массив в TMemoryStream


1-81776
Oleg_
2003-08-14 11:47
2003.08.25
кодирование строк


4-82005
Виталий22
2003-06-21 12:27
2003.08.25
Управление другим приложением