Конференция "Media" » Аналоговые часы
 
  • исследователь © (18.08.07 18:14) [0]
    Такой вопрос: пишу программку-прото аналоговые часики, для души, с поддержкой скинов. Есть красивые картинки скинов, но фон циферблата в них градиентный. Отсюда вопрос: как закрашивать стрелку по событию таймера так, чтобы не было ее видно, ведь ее нужно будет отрисовывать в другом месте.
  • Ricks © (18.08.07 18:18) [1]
    рисуй во временный битмап сначала фон, потом в нужном месте стрелку, а потом выводи
  • исследователь © (18.08.07 18:21) [2]
    CopyRect и BrushCopy?
  • Ricks © (18.08.07 18:26) [3]
    можно CopyRect, но вообще лучше BitBlt - немного быстрее
    BrushCopy, извини, не знаю что делает. я, вообще, все что связанно с Canvas <=> HDC делаю на API
  • исследователь © (18.08.07 18:30) [4]
    Алгоритм работы с вызовами функций можешь накидать примерно?
  • @!!ex © (18.08.07 19:07) [5]
    BitBlt(DestinationHandle, X,Y,Width,Height, SourceHandle, X,Y, SRCCOPY);
    Handle = Canvas.Handle
  • исследователь © (18.08.07 19:08) [6]
    Замечательый просто "алгоритм" :)

    Перефразирую: как скопировать часть формы в TBitmap?
  • @!!ex © (18.08.07 19:15) [7]
    Нахрена тебе копировать часть формы на битмап??
    Головой думай.
    Загружаешь свою картинку в BitMap1.
    Создаешь еще один BitMap. BitMap2.
    Такого же размера как и битмап1.
    Каждый кадр делаешь

    BitBlt(BitMap2.Canvas.Handle, X,Y,Width,Height, BitMap1.Canvas.Handle, X,Y, SRCCOPY);
    <Тут римуешь на втором битмапе стрелку>
    BitBlt(Form1.Canvas.Handle, X,Y,Width,Height, BitMap2.Canvas.Handle, X,Y, SRCCOPY);

    Ферштейн?
  • исследователь © (18.08.07 19:20) [8]
    Натюрлих :)
    Вопросы:
    0. Много ли памяти будет жрать?
    1. ВАЖНО: что есть X и Y?
    ведь у меня стрелка описывается так:

    MoveTo(центр_циферблата);
    LineTo(CX+Round(HArrow * sin(HA)), CY-Round(HArrow * cos(HA)));

    где

    Harrow - длина часовой стрелки, HA - угол поворота.

    2. Тоже ВАЖНО: что есть Width и Height? Свойства Bitmap1?
  • Ricks © (18.08.07 19:27) [9]
    Попытаюсь тебе объяснить. допустим тебе надо нарисовать прямоугольную область, верхний левый угол которой будет находиться в координатах (100; 150), и размером она будет 200 на 250 точек. Так вот X=100 Y=150, Width=200, Height=250. Усёк?

    В свойствах TBitmap есть Width и Height, а рисовать ты его будешь начиная с (X; Y)
  • исследователь © (18.08.07 19:37) [10]
    Это-то понятно, а вот со стрелкой - не очень. Вот я гружу в Bitmap1 изображение циферблата, так?

    Далее делаю Bitmap2.width:=bitam1.width; и то же с высотой. Так?

    Далее пишу

    xx:=bitmap1.width div 2;
    yy:=bitmap1.height div 2
    BitBlt(Bitmap2.Canvas.Handle,
           xx,yy,
           xx+Round(MArrow * sin(MA)), yy+Round(MArrow * cos(MA)),
           Bitmap1.Canvas.Handle, xx, yy, SRCCOPY);



    не пашет
  • исследователь © (18.08.07 19:41) [11]
    не обращайте внимания на опечатки
  • Ricks © (18.08.07 19:41) [12]
    Стрелку рисуй уже на самом битмапе
    Bitmap.Canvas.MoveTo()
    Bitmap.Canvas.LineTo();

    BitBlt это типа CopyRect - переносит прямоугольное изображение
  • исследователь © (18.08.07 19:44) [13]
    Про BitBlt я знаю, что она переносит изображение. А фон где рисовать?
  • исследователь © (18.08.07 19:54) [14]
    Все, понял, но осталась пара вопросов.

    Выходит, что x и у равны нулю, так как мы копируем полностью циферблат???
  • Ricks © (18.08.07 20:12) [15]
    Ну вот смотри и пробуй разобраться:
    type
     TForm1 = class(TForm)
       MainTimer: TTimer;
       procedure FormCreate(Sender: TObject);
       procedure FormClose(Sender: TObject; var Action: TCloseAction);
       procedure MainTimerTimer(Sender: TObject);
     private
       { Private declarations }
     public
      aImage : TBitmap;
      aSkin  : TBitmap;
     end;

    var
     Form1: TForm1;

    implementation

    {$R *.dfm}

    procedure TForm1.FormCreate(Sender: TObject);
    begin
    aImage:=TBitmap.Create;
    aSkin:=TBitmap.Create;

    aImage.Width:=100;
    aImage.Height:=100;

    aSkin.Width:=100;
    aSkin.Height:=100;

    aSkin.LoadFromFile(...)
    end;

    procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
    aImage.Free;
    aSkin.Free;
    end;

    procedure TForm1.Timer1Timer(Sender: TObject);
    var h, m, s, n : word;
       a : single;
    begin
    BitBlt( aImage.Canvas.Handle,
     0, 0, 100, 100, aSkin.Canvas.Handle, 0, 0, SRCCOPY );

    with aImage.Canvas do begin
     MoveTo(50, 50);
     DecodeTime(GetTime, h, m, s, n);
     a:=2*pi * s/60 + pi;
     LineTo( round(50 - sin(a) * 30), round(50 + cos(a) * 30) );
     TextOut(0, 0, IntToStr(s));
    end;

    BitBlt( Canvas.Handle,
     100, 100, 100, 100, aImage.Canvas.Handle, 0, 0, SRCCOPY );
    end;

  • исследователь © (18.08.07 20:14) [16]
    Ну в общем, как я и сказал, циферблат копируется полностью. Верно?
  • Ricks © (18.08.07 20:17) [17]
    Да.
    Сначала копируешь фон (циферблат) полностью во временный битмап, потом на временном рисуешь стрелку. И за этим рисуешь временный на форме.
    Удачи
  • исследователь © (18.08.07 20:18) [18]
    А вариант копировать только там, где стрелочка прорисовалась? Так и памяти жрать меньше будет
  • antonn © (18.08.07 20:40) [19]
    у тебя памяти 16Мб?
  • исследователь © (18.08.07 20:41) [20]
    Нет, 2 гига, но все же...
  • Ricks © (18.08.07 20:49) [21]
    ты потратишь больше памяти на копирование непрямоугольной картинки...
  • исследователь © (18.08.07 20:59) [22]
    Кстати, стала очень заметна рябь при использовании больших картинок.

    И еще: как теперь привязать к этому скины... копируем-то мы ПРЯМОУГОЛЬНЫЙ циферблат, а форма будет НЕПРЯМОУГОЛЬНАЯ...
  • исследователь © (18.08.07 20:59) [23]
    Кстати, стала очень заметна рябь при использовании больших картинок.

    И еще: как теперь привязать к этому скины... копируем-то мы ПРЯМОУГОЛЬНЫЙ циферблат, а форма будет НЕПРЯМОУГОЛЬНАЯ...
  • antonn © (18.08.07 21:20) [24]
    копируй прямоугольные, форму вырезай непрямоугольную, в чем загвоздка?
  • исследователь © (18.08.07 21:34) [25]
    Да я уж проверил... все норм... а вот с мерцанием -  это отстой.
  • исследователь © (18.08.07 21:38) [26]
    А как сделать линии плавными? В инете лишь дурацкий урок какой-то, но он не катит, а при изменении максимума x и у в нем на width и height формы она вообще не видна становится
  • исследователь © (18.08.07 23:32) [27]
    Никто не знает?
  • Vendict © (19.08.07 12:34) [28]
    была здесь как-то подобная тема, советовали сглаживание использовать. а по поводу как вырезать дырки из формы, у Флёнова(не ругайте, знаю) был пример.
  • исследователь © (19.08.07 14:46) [29]
    Да скин я сделал, а как сглаживание юзать?
  • @!!ex © (19.08.07 17:40) [30]
    > Кстати, стала очень заметна рябь при использовании больших
    > картинок.

    Косяк связанный с тем, что при перерисовке сначала форма заливаеться родным цветом, а потом на нее уже ложиться BitBlt.
    Из за этогО, елси например форма синяя, а копируеться белый битмап будет мерцание:
    форма при перерисовке заливаеться синим, на нее накладываеться битмап, при перерисовке битмап стирается цветом формы и накладываеться опять.

    решения есть, но я их точно не помню, а сейчас лезть искать код мне влом, поищи сам, тут где то не далеко это обсуждали.
  • antonn © (19.08.07 20:48) [31]
    решение против мерцания - либо двойной буфер (кстати bltbtn очень быстро работает, с ним не должно быть мерцания), либо выводит окошко через updatelayeredwindow() - понятия мерцать там вообще нет (как и понятия контрол, хыхыхы).
    рисовать гладкие линии - антиалиасинг. Простой метод - создавать битмап, в несколько раз больше "обычного", рисовать на нем все стрелки и фон так же в несколько раз больше, а потом в эти несколько раз уменьшать до размеров "обычного"
  • @!!ex © (19.08.07 20:55) [32]
    > [31] antonn ©   (19.08.07 20:48)

    Я думаю мерцание из-за того, что форма перерисовываеться сама.
    А насчет сглаживания, зачем уменьшать? Сразу рисовать с StretchBlt.
  • antonn © (19.08.07 21:17) [33]
    никаких StretchBlt, попиксельно через scanline со смешением цветов, а то науменьшаешь до "квадратиков":)
  • исследователь © (20.08.07 13:37) [34]
    Я нашел попиксельное решение, но даже с засовыванием в отделный тред прога просто виснет и все.
  • Dib@zol © (20.08.07 14:32) [35]
    InvalidateRect(<Компонент на который выводишь>.Handle, nil, FALSE);
    Это теоретически позволит избежать мерцания.
  • antonn © (20.08.07 15:39) [36]

    > Я нашел попиксельное решение, но даже с засовыванием в отделный
    > тред прога просто виснет и все.

    значит это не решение
  • исследователь © (20.08.07 16:16) [37]
    Может, ты подскажешь?
    Я имел ввиду, как ты понял, не свой код, а нашел в инете.
  • clickmaker © (20.08.07 16:23) [38]

    > исследователь ©   (18.08.07 18:14)

    а стрелка - это что? Bitmap или линиями?
    вариант с SetROP2 инверсным не подойдет?
  • исследователь © (20.08.07 17:27) [39]
    Стрелка линией рисуется, выше я это писал.
  • clickmaker © (20.08.07 17:37) [40]

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

    SetROP2(Canvas.Handle, R2_NOTXORPEN);

    рисуем
    секунда прошла
    рисуем в том же месте, тем самым стираем
    рисуем в другом месте
  • исследователь © (20.08.07 18:47) [41]
    И что это даст?
  • исследователь © (20.08.07 18:50) [42]
    И как ты это предлагаешь сделать? То есть исключить все наши махинации с bitBlt и прочим?
  • исследователь © (20.08.07 18:55) [43]
    Ааа... да зачем ты это вообще начал рассказывать? Я теперь над антиалисингом думаю...
  • @!!ex © (20.08.07 20:50) [44]
    > [43] исследователь ©   (20.08.07 18:55)
    > зачем ты

    Че над ним думать?
    Рисуй линию "руками" и все. Альясинг делаеться без проблем.
    Вместо четкой линии толщиной 1 пиксель, рисуеться четкая линия толщиной 1 символ и окаемка полупрозрачная толщиной в тот же 1 пиксель.
    Вот те и альясинг простейший.
  • исследователь © (20.08.07 21:29) [45]
    Ты че за бред сейчас сказал?


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

    это КАК???


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

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


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

    научи рисовать такую окаемку!
  • antonn © (20.08.07 22:25) [46]

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

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

    простой пример рисования линий со сглаживанием:
    http://desksoft.ru/index.php?downloads=attachments&id=6
  • исследователь © (20.08.07 22:42) [47]
    Антон, могу я задать вопросы по сорцу?
  • исследователь © (20.08.07 22:49) [48]
    У вас просто у самого прога есть dEskClock, может кинете часть сорцов на эту тему? Там как я поглядел у вас со стрелками все ОК.
  • antonn © (20.08.07 23:01) [49]
    там стрелки примерно так же и рисуются
  • исследователь © (20.08.07 23:07) [50]
    У меня не выходит? Можно как-то это обсудить подробнее? Я покажу сорец?
  • @!!ex © (20.08.07 23:07) [51]
    Антун, специально для вас:
    http://afera-net.narod.ru/clock.jpg
    Те самые 15 градусов, и чего же происходит при этих самых 15 градусах?

    Кстати, где нв твоем десктопе сглаженные лини то?
  • antonn © (20.08.07 23:09) [52]

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

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


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

    каком десктопе?
  • @!!ex © (20.08.07 23:11) [53]
    > у тебя монитор ЖК? Лупу дать? я отсюда вижу, что там "пила"
    > жуткая...

    Монитор ЖК, наверно хрение плохо, не вижу их без лупы.
  • antonn © (20.08.07 23:15) [54]
    вот, сравни, тфой циферблат и со сглаживанием
    http://desksoft.ru/images/43253253.JPG (30Кб)
    (если так не видно, то хоть в пайнте, потому как лестница там приличная)
  • исследователь © (20.08.07 23:23) [55]
    Господа, господа, прошу вас, успокойтесь!
    Я ведь реально хочу понять, но у меня не выходит! Можно я не знаю код выкинуть сюда чтоб вы скзаали в чем бага?
  • antonn © (20.08.07 23:25) [56]
    только если не много:)

    товарищ модератор, перенесите тему в "Медия", пожалуйста.
  • исследователь © (20.08.07 23:37) [57]
    Только перед выкладыванием: скажите, фон (в данном случае циферблдат) тоже ведь надо увеличивать в три раза?
  • antonn © (20.08.07 23:39) [58]
    ага, но потом при сжатии фон и останется каким был
  • исследователь © (20.08.07 23:40) [59]
    А как увеличить фон?
  • исследователь © (20.08.07 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 © (20.08.07 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;

  • исследователь © (20.08.07 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.

  • исследователь © (21.08.07 00:02) [63]
    Что я делаю:

    1. в форм крит

    Гружу в tm1 циферблат
    Увеличиваю в три раза в tm3
    для проверки кидаю в TImage, бред там
    по тику таймера считаю углы и закрашиваю все циферблатом (походу тут баг, т.к. размеры не совпадают)
    рисую стрелки
    делаю АА
    вывожу на форму
  • antonn © (21.08.07 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)
  • исследователь © (21.08.07 00:34) [65]
    Спасибо, но стрелки теперь не по центру рисуются.
  • исследователь © (21.08.07 00:40) [66]
    Понял, просто Cx и CY тоже ж на 3 надо умножать
  • исследователь © (21.08.07 00:40) [67]
    Понял, просто Cx и CY тоже ж на 3 надо умножать
  • antonn © (21.08.07 00:43) [68]
    для красоты можно умножить на 3 и прибавить 1, так они будут лучше смазаны.
    кстати, толщину линии тоже на 3 нужно умножить:)
  • исследователь © (21.08.07 00:56) [69]
    Я уже должен Вам отвесить огромный поклон. Но можно еще последнийх три вопроса: на основе чего работает алгоритм AA? Как я понял, берется цветовой массив каждой из строк картинки, затем в ней анализируются по три смежных индекса массива (как я понял, идут тройки: R1G1B1R2G2B2... верно?), это происходит в каждой из смежныхъ строк, затем идет замена в одной определенной строчке (ЧТО это за строка, объясните! Почему именно она?), цветовых составляющих, и это что-тьо дает. Это втрой вопрос - что? И третий - верно ли я понял? :)
  • antonn © (21.08.07 01:07) [70]
    берется изображение, увеличивается в три раза "квадратным способом", т.е. без всяких сглаживаний, просто "увеличиваются" пиксели в три раза.
    при вызове Alias просто берем 9 пикселей (в квадрате 3*3) и для каждого канала считаем среднее значение, и это значение вписываем в результирующий битмап. Для фона ничего не изменится, потому как эти 9 пикселей будут одинаковы.

    Про строчку не понял, где какая строка смущает? :)
  • исследователь © (21.08.07 01:13) [71]
    Так с того, что мы вписали среднее значение, как я и сказал, что случилось?

    Смущает строчка DestRow, ведь это строки (в битмапе на 12 строк) номер 0, 1, 2 и 3. Почему только они?
  • antonn © (21.08.07 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 пикселей. Все равно не понял, в чем вопрос:)
  • исследователь © (21.08.07 01:40) [73]
    Почему мы в DestRow загоняем ср. знач. пикселей, ведь на 12 строк destrow - Это всего четыре строки?
  • antonn © (21.08.07 01:58) [74]
    DestRow := SourceBitmap.ScanLine[y]; - это на каждую строку выходного битмапа, т.е. равно высоте битмапа.

    просто получается так. На этом увеличенном битмапе в левом верхнем углу выходит сжатое изображение, которое копируется на канву (можно сохранить битмап в файл перед CanvasOut.CopyRect() и посмотреть, на фоне большой копии в углу будет сжатое со сглаживаением)
  • исследователь © (21.08.07 02:11) [75]
    Хм, не на каждую - у идет от 0 до (высота div 3) -1
  • исследователь © (21.08.07 03:04) [76]
    Я ошибаюсь? Вы поправьте меня, если я не прав.
  • @!!ex © (21.08.07 09:40) [77]
    > [54] antonn ©   (20.08.07 23:15)

    С лупой смотрел, особой разницы не заметил.
    Но при ближайшем рассмотрении действительно зубцы есть.
    Будет время сегодня вечером чуть модифицирую, чтобы не было зубцов.
    ИМХо применять альясинг ко всей картинке, при рисовании одной линии - слегка расточительно....
  • Сергей М. © (21.08.07 10:21) [78]

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


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

    То, о чем ты ведешь речь, к скинам имеет самое отдаленное отношение и сводится просто к смене/масштабированию статической фоновой картинки.
  • исследователь © (21.08.07 11:03) [79]

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

    Ты хоть номер поста ставь, я не понял, о чем ты.
  • Сергей М. © (21.08.07 11:16) [80]

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


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


    О том что ты в самом изначальном вопросе упомянул про "поддержку скинов", в то время как скинами тут и не пахнет, а пахнет всего лишь банальной сменой/масштабированием статической фоновой картинки.
  • исследователь © (21.08.07 11:27) [81]
    В любом случае создается регион, которые затем и присваивается форме.
  • antonn © (21.08.07 11:39) [82]

    > @!!ex ©   (21.08.07 09:40) [77]
    >
    > ИМХо применять альясинг ко всей картинке, при рисовании
    > одной линии - слегка расточительно....

    ко всей - да, но в примере указывается регион, в котором будет рисоваться стрелка, т.ч в худшем случае это будет квадрат с диагональю стрелки. А для всех стрелок (часы, минуты, секунды) почти весь вон, но зато сглажено.
  • Сергей М. © (21.08.07 11:48) [83]

    > создается регион, которые затем и присваивается форме


    А где "центр" произвольно заданного региона ?
  • antonn © (21.08.07 12:41) [84]

    >
    > А где "центр" произвольно заданного региона ?

    наверное там, где поставит его разработчик скина, который этот регион и нарисует
  • исследователь © (21.08.07 13:40) [85]
    Антон, Вы все же можете про DestRow ответить?
  • antonn © (21.08.07 13:55) [86]
    да я не пойму, что там непонятно:)
    DestRow - строка пикселей, из которых будет состоять результирующиее изображение.
  • исследователь © (21.08.07 13:59) [87]
    я ЭТО понимаю. Но ведь destrow - это не все строки картинки, а только первая треть их!!!
  • antonn © (21.08.07 16:05) [88]
    это все строки результирущего изображения:)
    другое дело, что их в 3 раза меньше, чем растянутое в 3 раза изображение:)
  • исследователь © (21.08.07 16:14) [89]
    ааа точно понял))) Спасибо огромное!
  • исследователь © (21.08.07 17:24) [90]
    Кстати, со скинами шняга - по окружности формы идет ободок где-то в 1 пиксель...
  • исследователь © (21.08.07 20:32) [91]
    Кто знает, как подправить?
  • исследователь © (22.08.07 12:27) [92]
    А у Вас, Антон, как это исправлено?
  • antonn © (22.08.07 23:49) [93]
    без скриншота я вообше не пойму, о чем разговор идет:)
  • исследователь © (23.08.07 10:48) [94]
    Давайте покажу скриншот: http://slil.ru/24767725
  • Ricks © (23.08.07 18:10) [95]
    Давно не заглядывал сюда. Неужели никто не догадался подсказать человеку насчет "мерцания"? Тогда это сделаю я :)

    впиши в protected :
    procedure WMEraseBkgnd(var Message: TWMEraseBkgnd); message WM_ERASEBKGND;

    а в самой процедуре напиши:
    procedure xxx.WMEraseBkgnd;
    begin
    message.result:=1;
    end;

    и все, мерцание исчезнет! :)

    а саму картинку выводи в OnPaint, или сделай обработчик WM_PAINT, но для этого сначала изучи его. :)
  • antonn © (23.08.07 21:41) [96]

    > Неужели никто не догадался подсказать человеку насчет "мерцания"?

    догадались, где то раньше, заодно предложив сделать окно с альфаканалом, и ободки исчезнут, и красотища будет страшшшшная:)
  • исследователь © (24.08.07 00:01) [97]
    Черт... Антон, Вы делали с альфаканалом? Я даже боюсь спросить, как это сделать на Delphi... Подскажете?
  • antonn © (24.08.07 00:23) [98]
  • исследователь © (24.08.07 09:20) [99]
    Господи... красота-то какая... Теперь понять бы, как это работает :)

    Вопросик - откуда во втором битмапе маска? Это уже дело фотошопа?
  • antonn © (24.08.07 12:13) [100]
    два битмапа в timage - это "лицевая" часть и альфаканал битмапа, который из них собирается. (у битмапа pf32bit проме каналов RGB есть еще один байт, его под альфаканал используют).
  • исследователь © (24.08.07 13:59) [101]
    я имею ввиду, как сделана была маска
  • antonn © (24.08.07 16:12) [102]
    в обычном редакторе:) Corel Photo-paint
  • исследователь © (24.08.07 17:07) [103]
    Можете сказать, какие действия (по менюхам) были проделаны, или вообще какой эффект с картинкой произведен?
  • antonn © (24.08.07 20:11) [104]
    да просто нарисована такая, вручную, без каких то инструментов специальных
  • исследователь © (24.08.07 20:27) [105]
    Исходная - да. А ту что, черно-белой сделали?
  • antonn © (24.08.07 21:19) [106]
    я про нее и говорю, просто нарисовал две картинки, лицевую и маску. Эот не сложно ведь:)
  • исследователь © (24.08.07 22:54) [107]
    Тогда можно вопрос - следовательно, мне нужен еще 1 битмап, куда я засуну ч/б циферблат?
  • antonn © (25.08.07 09:51) [108]
    нужна лицевая стороноа и нужна маска, а маска это не просто черно-белая картинка, это маска:) она определяет где прозрачно будет, а где нет. Можно использовать сразу 32х битный битмап, загружаеть его, если он есть:) я там просто для наглядности сделал сборку 32 битного из двух 24 битных
  • исследователь © (25.08.07 11:22) [109]
    А как маску-то эту сделать? Вот прозрачно - это какой цвет, а непрозрачно - какой?
  • antonn © (25.08.07 11:39) [110]
    белый - непрозрачно, черный - прозрачно полностью
  • исследователь © (25.08.07 19:05) [111]
    Ясно, 10х. Ну а у меня, как я понимаю, будет белым циферблат весь, вместе со штрихами и прочим, а черным - фон квадрата, в который циферблат и вписан, верно?

    кстати, по поводу исходника - зачем Вы там запролняете rgbtReserved. SDK и MSDN говорят, что "must be 0"
  • antonn © (25.08.07 21:38) [112]

    > Ясно, 10х. Ну а у меня, как я понимаю, будет белым циферблат
    > весь, вместе со штрихами и прочим, а черным - фон квадрата,
    >  в который циферблат и вписан, верно?

    ага

    rgbtReserved это и есть альфаканал
  • исследователь © (26.08.07 12:19) [113]
    а операции с другими составляющими цвета зачем?

    Я нашел что-то похожее на эти операции в MSDN, где рассказывалось про альфа-блендинг, но все же не то. Поясните их, пожалуйста.
  • antonn © (26.08.07 22:10) [114]
    да так, для выпендрежа. можно их и не трогать, но тогда на неготорых фигурах появлялись ободки. функция писалась не конкретно для примера просто...
  • исследователь © (27.08.07 08:56) [115]
    Значит, на данный момент в моей проге появлется еще и Bitmap4:TBitmap; , в который я на FormCreate прописываю загрузку в него маски циферблата. Скажите, Вы делали так же? Потому что столько битмапов... страшно...
  • antonn © (28.08.07 12:09) [116]
    у меня еще больше :) чего страшного то? :)
  • исследователь © (29.08.07 10:17) [117]
    :) тормоза)))
 
Конференция "Media" » Аналоговые часы
Есть новые Нет новых   [134431   +10][b:0.001][p:0.007]