Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Media";
Текущий архив: 2008.11.30;
Скачать: [xml.tar.bz2];

Вниз

Аналоговые часы   Найти похожие ветки 

 
clickmaker ©   (2007-08-20 17:37) [40]


> Стрелка линией рисуется

SetROP2(Canvas.Handle, R2_NOTXORPEN);

рисуем
секунда прошла
рисуем в том же месте, тем самым стираем
рисуем в другом месте


 
исследователь ©   (2007-08-20 18:47) [41]

И что это даст?


 
исследователь ©   (2007-08-20 18:50) [42]

И как ты это предлагаешь сделать? То есть исключить все наши махинации с bitBlt и прочим?


 
исследователь ©   (2007-08-20 18:55) [43]

Ааа... да зачем ты это вообще начал рассказывать? Я теперь над антиалисингом думаю...


 
@!!ex ©   (2007-08-20 20:50) [44]

> [43] исследователь ©   (20.08.07 18:55)
> зачем ты

Че над ним думать?
Рисуй линию "руками" и все. Альясинг делаеться без проблем.
Вместо четкой линии толщиной 1 пиксель, рисуеться четкая линия толщиной 1 символ и окаемка полупрозрачная толщиной в тот же 1 пиксель.
Вот те и альясинг простейший.


 
исследователь ©   (2007-08-20 21:29) [45]

Ты че за бред сейчас сказал?


> Вместо четкой линии толщиной 1 пиксель, рисуеться четкая
> линия толщиной 1 символ

это КАК???


>  толщиной 1 символ

а это КАК - конкретно?


> окаемка полупрозрачная толщиной в тот же 1 пиксель.

научи рисовать такую окаемку!


 
antonn ©   (2007-08-20 22:25) [46]


> Вот те и альясинг простейший.

ыхыхых, прикольно:)
получится толстая зубатая линия с расплывчатыми краями, особенно шикарно она будет выглядеть под углом 15 градусов:)

простой пример рисования линий со сглаживанием:
http://desksoft.ru/index.php?downloads=attachments&id=6


 
исследователь ©   (2007-08-20 22:42) [47]

Антон, могу я задать вопросы по сорцу?


 
исследователь ©   (2007-08-20 22:49) [48]

У вас просто у самого прога есть dEskClock, может кинете часть сорцов на эту тему? Там как я поглядел у вас со стрелками все ОК.


 
antonn ©   (2007-08-20 23:01) [49]

там стрелки примерно так же и рисуются


 
исследователь ©   (2007-08-20 23:07) [50]

У меня не выходит? Можно как-то это обсудить подробнее? Я покажу сорец?


 
@!!ex ©   (2007-08-20 23:07) [51]

Антун, специально для вас:
http://afera-net.narod.ru/clock.jpg
Те самые 15 градусов, и чего же происходит при этих самых 15 градусах?

Кстати, где нв твоем десктопе сглаженные лини то?


 
antonn ©   (2007-08-20 23:09) [52]


> Те самые 15 градусов, и чего же происходит при этих самых
> 15 градусах?

у тебя монитор ЖК? Лупу дать? я отсюда вижу, что там "пила" жуткая...


> Кстати, где нв твоем десктопе сглаженные лини то?

каком десктопе?


 
@!!ex ©   (2007-08-20 23:11) [53]

> у тебя монитор ЖК? Лупу дать? я отсюда вижу, что там "пила"
> жуткая...

Монитор ЖК, наверно хрение плохо, не вижу их без лупы.


 
antonn ©   (2007-08-20 23:15) [54]

вот, сравни, тфой циферблат и со сглаживанием
http://desksoft.ru/images/43253253.JPG (30Кб)
(если так не видно, то хоть в пайнте, потому как лестница там приличная)


 
исследователь ©   (2007-08-20 23:23) [55]

Господа, господа, прошу вас, успокойтесь!
Я ведь реально хочу понять, но у меня не выходит! Можно я не знаю код выкинуть сюда чтоб вы скзаали в чем бага?


 
antonn ©   (2007-08-20 23:25) [56]

только если не много:)

товарищ модератор, перенесите тему в "Медия", пожалуйста.


 
исследователь ©   (2007-08-20 23:37) [57]

Только перед выкладыванием: скажите, фон (в данном случае циферблдат) тоже ведь надо увеличивать в три раза?


 
antonn ©   (2007-08-20 23:39) [58]

ага, но потом при сжатии фон и останется каким был


 
исследователь ©   (2007-08-20 23:40) [59]

А как увеличить фон?


 
исследователь ©   (2007-08-20 23:43) [60]

Я по глупости своей пишу

tm1.LoadFromFile("back.bmp");
// tm1 - это перем. типа TBitmap
tm1.width:=tm1.width*3;
tm1.height:=tm1.height*3;
tm1.stretchdraw(rect(0,0,tm1.width,tm1.height), tm1);

но это бред, не работает.


 
antonn ©   (2007-08-20 23:44) [61]

через CopyRect()
там в примере есть код, который на определенной области рисует сглаженные линии. Создается временный битмап, размерами в 3 раза больше нужной области.
var _Bitmap:Tbitmap;
begin
_Bitmap:=TBitmap.Create;
 try

BitmapPrepare(_Bitmap,Image1.Picture.Bitmap.Canvas,rect(10,10,200,200)); //берем прямоугольник, в котором будет рисовать, и увеличия ваего в 3 раза копируем на временный битмап

//дальше работаем с _Bitmap.canvas как нам надо

_Bitmap.Canvas.Pen.Width:=3; //устанавливаем толщину в 3 раз больше

_Bitmap.Canvas.Ellipse(20*3,20*3,80*3,80*3);
_Bitmap.Canvas.MoveTo(50*3-1,60*3-1); //все координаты в 3 раза больше (хотя для лучшего эффекта, можно отнять еденицу - будет более смазано и качественно, главное не переборщить:))
_Bitmap.Canvas.LineTo(5*3,15*3);

_Bitmap.Canvas.Brush.Style:=bsclear;
_Bitmap.canvas.Font.Size:=_Bitmap.canvas.Font.Size*3; //тут правда косячно с размером...
_Bitmap.canvas.TextOut(2,2,"Im - super :)");

Alias(_Bitmap,Image1.Picture.Bitmap.Canvas,rect(10,10,200,200)); //вывод временного битмапа с уменьшением на "лицевой" битмап

 finally
_Bitmap.Free;
 end;
end;


 
исследователь ©   (2007-08-20 23:58) [62]

В общем, ничего не выходит. Процедура делания скина вырезана для уменьшения поста.

unit uMain;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, ExtCtrls;

type
 TfrmMain = class(TForm)
   timer1: TTimer;
   Image1: TImage;
   procedure FormCreate(Sender: TObject);
   procedure timer1Timer(Sender: TObject);
 private
   { Private declarations }
   procedure DrawArrows(c1, c2, c3 : TColor);
 public
   { Public declarations }
 end;

var
 frmMain: TfrmMain;
 CX, CY, HArrow, MArrow, SArrow : Integer;
 HA, MA, SA : Real;
 H, M, S, MS : word;
 tm1, tm2, tm3 : TBitmap;
implementation

{$R *.dfm}

procedure Alias(var SourceBitmap:TBitmap; CanvasOut:TCanvas; _R:TRect);
const
 MaxPixelCount = MaxInt div SizeOf(TRGBTriple);
type
 PRGBArray = ^TRGBArray;
 TRGBArray = array[0..MaxPixelCount-1] of TRGBTriple;
var
 x,y,cx,cy,cxi,totr,totg,totb,i: Integer;
 Row1,Row2,Row3,DestRow: PRGBArray;
begin
 for Y:=0 to (SourceBitmap.Height div 3)-1 do begin
   cy := y*3;
   DestRow := SourceBitmap.ScanLine[y];
   Row1:=SourceBitmap.ScanLine[cy];
   Row2:=SourceBitmap.ScanLine[cy+1];
   Row3:=SourceBitmap.ScanLine[cy+2];
  for x := 0 to (SourceBitmap.Width div 3)-1 do begin
     cx := x*3;
     totr := 0; totg := 0; totb := 0;
       for i := 0 to 2 do begin
         cxi := cx + i;
         totr := totr + Row1[cxi].rgbtRed + Row2[cxi].rgbtRed + Row3[cxi].rgbtRed;
         totg := totg + Row1[cxi].rgbtGreen + Row2[cxi].rgbtGreen + Row3[cxi].rgbtGreen;
         totb := totb + Row1[cxi].rgbtBlue + Row2[cxi].rgbtBlue + Row3[cxi].rgbtBlue;
       end;
       DestRow[x].rgbtRed := totr div 9;
       DestRow[x].rgbtGreen := totg div 9;
       DestRow[x].rgbtBlue := totb div 9;
   end;
  end;
 CanvasOut.CopyRect(_R,SourceBitmap.Canvas,rect(0,0,SourceBitmap.Width div 3,SourceBitmap.Height div 3));
end;

procedure BitmapPrepare(var SourceBitmap:Tbitmap; CanvasOut:TCanvas; _R:TRect);
begin
SourceBitmap.PixelFormat:=pf24bit;
SourceBitmap.Width:=(_r.Right-_r.Left)*3;
SourceBitmap.Height:=(_r.Bottom-_r.Top)*3;
SourceBitmap.Canvas.CopyRect(rect(0,0,SourceBitmap.Width,SourceBitmap.Height),Ca nvasOut,_R);
end;

procedure TfrmMain.DrawArrows(c1, c2, c3: TColor);
var r : LongBool;
begin
with tm3.Canvas do
begin
 SetBkMode(Handle, Transparent);
 Pen.Color := clBlack;
 Font.Name := "Arial";
 Font.Style := [fsBold];
 TextOut(tm2.Width-60, tm2.Height div 2-8, Copy(DateToStr(Now),1,2));
 Pen.Color := c1;
 MoveTo(CX, CY);
 Pen.Width := 4;
 LineTo(CX+Round(HArrow  * 3 *  sin(HA)), CY-Round(HArrow * 3 * cos(HA)));
 MoveTo(CX, CY);
 Pen.Color := c2;
 Pen.Width := 3;
 LineTo(CX+Round(MArrow  * 3 * sin(MA)), CY-Round(MArrow  * 3 * cos(MA)));
 Pen.Color := c3;
 Pen.Width := 2;
 MoveTo(CX, CY);
 LineTo(CX+Round(SArrow  * 3 *  sin(SA)), CY-Round(SArrow * 3 *cos(SA)));
end;
image1.Picture.Assign(tm3);
end;

procedure TfrmMain.FormCreate(Sender: TObject);
begin
HArrow := CX - 30;
MArrow := CX - 50;
SArrow := CX - 70;
tm3 := TBitmap.Create;
tm1 := TBitmap.Create;
tm2 := TBitmap.Create;
tm1.LoadFromFile("background.bmp");
tm2.Height:=tm1.Height;
tm2.Width := tm1.Width;
BitmapPrepare(tm3, tm1.Canvas, rect(0,0,tm1.Width,tm1.Height));
CX := tm1.Width div 2;
CY := tm1.Height div 2;
timer1timer(sender);
// frmMain.clientWidth := tm1.Width;
//frmMain.clientHeight := tm1.Height;
// SetWindowRgn(Self.Handle, BitmapToRgn(tm1), True);
end;

procedure TfrmMain.timer1Timer(Sender: TObject);
begin
DecodeTime(Time, H, M, S, MS);
HA := (H/6 + M/360 + S/21600)*PI + PI;
MA := (M/30 + S/1800)*PI + PI;
SA := (S/30 + MS/30000)*PI + PI;
BitBlt(tm3.Canvas.Handle,
       0,0,
       tm3.Width,tm3.Height,
       tm1.Canvas.Handle, 0,0, SRCCOPY);
DrawArrows(clRed, clGreen, clBlue);
Alias(tm3, tm2.Canvas, Rect(0,0, tm3.Width,tm3.Height));
BitBlt(Canvas.Handle, 0,0,Width,Height, tm2.Canvas.Handle,0,0, SRCCOPY);
end;

end.


 
исследователь ©   (2007-08-21 00:02) [63]

Что я делаю:

1. в форм крит

Гружу в tm1 циферблат
Увеличиваю в три раза в tm3
для проверки кидаю в TImage, бред там
по тику таймера считаю углы и закрашиваю все циферблатом (походу тут баг, т.к. размеры не совпадают)
рисую стрелки
делаю АА
вывожу на форму


 
antonn ©   (2007-08-21 00:27) [64]

BitmapPrepare(tm3, tm1.Canvas, rect(0,0,tm1.Width,tm1.Height));
подставить вместо
BitBlt(tm3.Canvas.Handle,
      0,0,
      tm3.Width,tm3.Height,
      tm1.Canvas.Handle, 0,0, SRCCOPY);

image1.Picture.Assign(tm3); из DrawArrows убрать

Alias(tm3, tm2.Canvas, Rect(0,0, tm3.Width,tm3.Height)); - размеры выводимой области равны изначальной - rect(0,0,tm1.Width,tm1.Height)


 
исследователь ©   (2007-08-21 00:34) [65]

Спасибо, но стрелки теперь не по центру рисуются.


 
исследователь ©   (2007-08-21 00:40) [66]

Понял, просто Cx и CY тоже ж на 3 надо умножать


 
исследователь ©   (2007-08-21 00:40) [67]

Понял, просто Cx и CY тоже ж на 3 надо умножать


 
antonn ©   (2007-08-21 00:43) [68]

для красоты можно умножить на 3 и прибавить 1, так они будут лучше смазаны.
кстати, толщину линии тоже на 3 нужно умножить:)


 
исследователь ©   (2007-08-21 00:56) [69]

Я уже должен Вам отвесить огромный поклон. Но можно еще последнийх три вопроса: на основе чего работает алгоритм AA? Как я понял, берется цветовой массив каждой из строк картинки, затем в ней анализируются по три смежных индекса массива (как я понял, идут тройки: R1G1B1R2G2B2... верно?), это происходит в каждой из смежныхъ строк, затем идет замена в одной определенной строчке (ЧТО это за строка, объясните! Почему именно она?), цветовых составляющих, и это что-тьо дает. Это втрой вопрос - что? И третий - верно ли я понял? :)


 
antonn ©   (2007-08-21 01:07) [70]

берется изображение, увеличивается в три раза "квадратным способом", т.е. без всяких сглаживаний, просто "увеличиваются" пиксели в три раза.
при вызове Alias просто берем 9 пикселей (в квадрате 3*3) и для каждого канала считаем среднее значение, и это значение вписываем в результирующий битмап. Для фона ничего не изменится, потому как эти 9 пикселей будут одинаковы.

Про строчку не понял, где какая строка смущает? :)


 
исследователь ©   (2007-08-21 01:13) [71]

Так с того, что мы вписали среднее значение, как я и сказал, что случилось?

Смущает строчка DestRow, ведь это строки (в битмапе на 12 строк) номер 0, 1, 2 и 3. Почему только они?


 
antonn ©   (2007-08-21 01:32) [72]


> Так с того, что мы вписали среднее значение, как я и сказал,
>  что случилось?

для фона - ничего, а вот для тех частей, где нарисована стрелка - там будет темнее (тем темнее, чем больше там видно стрелки).
Допустим фон, был один пиксель, его размножили:
0 0 0
0 0 0
0 0 0

если его теперь сложить из этих 9 пикселей, то среднее будет 0, как и изначальное.

нарисовали стрелку под углом, она "слегка" задела несколько пикселей
1 1 0
1 0 0
0 0 0

теперь сренее будет не 0, а с "примесью" стрелки.
вообще для эксперимента можно натыкать в код типа такого
botmap.savetromfile("C:\1.bmp"); и в панте в приближении рассмореть эти пиксели:)

DestRow - это строка выходного битмапа, в него загоняется среднее значение канала из 9 пикселей. Все равно не понял, в чем вопрос:)


 
исследователь ©   (2007-08-21 01:40) [73]

Почему мы в DestRow загоняем ср. знач. пикселей, ведь на 12 строк destrow - Это всего четыре строки?


 
antonn ©   (2007-08-21 01:58) [74]

DestRow := SourceBitmap.ScanLine[y]; - это на каждую строку выходного битмапа, т.е. равно высоте битмапа.

просто получается так. На этом увеличенном битмапе в левом верхнем углу выходит сжатое изображение, которое копируется на канву (можно сохранить битмап в файл перед CanvasOut.CopyRect() и посмотреть, на фоне большой копии в углу будет сжатое со сглаживаением)


 
исследователь ©   (2007-08-21 02:11) [75]

Хм, не на каждую - у идет от 0 до (высота div 3) -1


 
исследователь ©   (2007-08-21 03:04) [76]

Я ошибаюсь? Вы поправьте меня, если я не прав.


 
@!!ex ©   (2007-08-21 09:40) [77]

> [54] antonn ©   (20.08.07 23:15)

С лупой смотрел, особой разницы не заметил.
Но при ближайшем рассмотрении действительно зубцы есть.
Будет время сегодня вечером чуть модифицирую, чтобы не было зубцов.
ИМХо применять альясинг ко всей картинке, при рисовании одной линии - слегка расточительно....


 
Сергей М. ©   (2007-08-21 10:21) [78]


> исследователь


Скин-механизмы работают совершенно по-иному.

То, о чем ты ведешь речь, к скинам имеет самое отдаленное отношение и сводится просто к смене/масштабированию статической фоновой картинки.


 
исследователь ©   (2007-08-21 11:03) [79]


> Сергей М. ©   (21.08.07 10:21) [78]

Ты хоть номер поста ставь, я не понял, о чем ты.


 
Сергей М. ©   (2007-08-21 11:16) [80]


> исследователь ©   (21.08.07 11:03) [79]
>
>


> я не понял, о чем ты.


О том что ты в самом изначальном вопросе упомянул про "поддержку скинов", в то время как скинами тут и не пахнет, а пахнет всего лишь банальной сменой/масштабированием статической фоновой картинки.



Страницы: 1 2 3 вся ветка

Форум: "Media";
Текущий архив: 2008.11.30;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.62 MB
Время: 0.01 c
2-1224477221
Fynjy
2008-10-20 08:33
2008.11.30
путь к файлу в разделе HKEY_CURRENT_USER software printer name


2-1224490297
Mozgan
2008-10-20 12:11
2008.11.30
Перенос компонента из delphi 6 в delphi 7


2-1224157114
lead-in
2008-10-16 15:38
2008.11.30
FreeMem


2-1224497497
tonick2001
2008-10-20 14:11
2008.11.30
Не ловится исключение


2-1224222180
SKIPtr
2008-10-17 09:43
2008.11.30
управление менеджером закачек





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