Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
14-81940
Vlad Oshin
2003-08-07 08:50
2003.08.25
Какой сервис пак тащить?


1-81625
Zhker
2003-08-12 22:06
2003.08.25
Как добавить свою кнопку на панель IE


8-81846
Василий Петрович
2003-04-15 09:28
2003.08.25
Как играть xm?


14-81938
McSimm
2003-08-05 18:11
2003.08.25
Объявление! Проблемы с почтовым ящиком сайта.


14-81913
Михайлов Антон
2003-08-08 19:03
2003.08.25
Типа компилятора...





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