Конференция "Media" » Вывести графику на Canvas с Anti-Aliasing'ом [D7, WinXP]
 
  • hypnotize (10.03.07 11:45) [0]
    Здратвуйте Мастера! Не знает ли кто-нибудь из присутвующих как выводить на Канву графику (с Трансперентом) со сглаживанием (Анти-Алиасингом)? То есть нету ли какого либо аналога процедуры
    Canvas.Draw(x,y,graphic);

    только, со сглаживанием)
  • Ricks © (10.03.07 12:09) [1]
    Аналога нет, и уточни что тебе надо рисовать? Картинку или примитивы?
  • GrayFace © (10.03.07 12:13) [2]
    Разве картинку возможно выводить с антиальясингом? По сабжу ничего не скажу, погугли, для С++ имеется библиотека с такими штуками.
  • Ricks © (10.03.07 12:32) [3]
    Может нужна 32-х битная картинка?
    Тогда смотри AlphaBlend или пиши свою процедуру!
  • hypnotize (10.03.07 12:41) [4]
    Выводить нужно Bitmap с
    Transperent:=true;

    (невидимая часть фиолетовым цветом закрашена) , но после вывода очень заметны грани, нельзя ли их сгладить как нить? Дело в том что я сам не понимаю принцип работы Анти Алиасинга, я нашел в инете один примерчик, но он жуууутко тормозит.
    А как отрисовать картинку с AlphaBlend'ом?
  • oxffff © (10.03.07 13:20) [5]
    Тебе поможет GDI+.

    Здесь порт на delphi
         {******************************************************************}
         { GDI+ API                                                         }
         {                                                                  }
         { home page : http://www.progdigy.com                              }
         { email     : hgourvest@progdigy.com                               }
         {                                                                  }
         { date      : 15-02-2002                                           }
         {                                                                  }
         { The contents of this file are used with permission, subject to   }
         { the Mozilla Public License Version 1.1 (the "License"); you may  }
         { not use this file except in compliance with the License. You may }
         { obtain a copy of the License at                                  }
         { http://www.mozilla.org/MPL/MPL-1.1.html                          }
         {                                                                  }
         { Software distributed under the License is distributed on an      }
         { "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or   }
         { implied. See the License for the specific language governing     }
         { rights and limitations under the License.                        }
         {                                                                  }
         { *****************************************************************}
  • oxffff © (10.03.07 13:23) [6]
    Есть eще GDI функции BitBlt,MaskBlt,StretchBlt.
  • oxffff © (10.03.07 13:27) [7]
    Если тебе нужен Анти-Алиасинг тогда используй GDI+

    SetCompositingMode Method у TGPGraphic

    CompositingModeSourceOver
    Specifies that when a color is rendered, it is blended with the background color. The blend is determined by the alpha component of the color being rendered.

    CompositingModeSourceCopy
    Specifies that when a color is rendered, it overwrites the background color. This mode cannot be used along with TextRenderingHintClearTypeGridFit.

    Graphics::SetInterpolationMode Method у TGPGraphic

    Constants

    InterpolationModeInvalid
    Used internally

    InterpolationModeDefault
    Specifies the default interpolation mode.

    InterpolationModeLowQuality
    Specifies a low-quality mode.

    InterpolationModeHighQuality
    Specifies a high-quality mode.

    InterpolationModeBilinear
    Specifies bilinear interpolation. No prefiltering is done. This mode is not suitable for shrinking an image below 50 percent of its original size.

    InterpolationModeBicubic
    Specifies bicubic interpolation. No prefiltering is done. This mode is not suitable for shrinking an image below 25 percent of its original size.

    InterpolationModeNearestNeighbor
    Specifies nearest-neighbor interpolation.

    InterpolationModeHighQualityBilinear
    Specifies high-quality, bilinear interpolation. Prefiltering is performed to ensure high-quality shrinking.

    InterpolationModeHighQualityBicubic
    Specifies high-quality, bicubic interpolation. Prefiltering is performed to ensure high-quality shrinking. This mode produces the highest quality transformed images.

    Вот и все.
  • oxffff © (10.03.07 13:35) [8]
    Анти-Алиас здесь
    Graphics::SetSmoothingMode Method

    The SmoothingMode enumeration specifies the type of smoothing (antialiasing) that is applied to lines and curves. This enumeration is used by the GetSmoothingMode and SetSmoothingMode methods of the Graphics class.

    Syntax

    typedef enum {
       SmoothingModeInvalid = QualityModeInvalid,
       SmoothingModeDefault = QualityModeDefault,
       SmoothingModeHighSpeed = QualityModeLow,
       SmoothingModeHighQuality = QualityModeHigh,
       SmoothingModeNone,
       SmoothingModeAntiAlias8x4,
       SmoothingModeAntiAlias = SmoothingModeAntiAlias8x4,
       SmoothingModeAntiAlias8x8
    } SmoothingMode;

    Constants

    SmoothingModeInvalid
    Reserved.

    SmoothingModeDefault
    Specifies that smoothing is not applied.

    SmoothingModeHighSpeed
    Specifies that smoothing is not applied.

    SmoothingModeHighQuality
    Specifies that smoothing is applied using an 8 X 4 box filter.

    SmoothingModeNone
    Specifies that smoothing is not applied.

    SmoothingModeAntiAlias8x4
    Specifies that smoothing is applied using an 8 X 4 box filter.

    SmoothingModeAntiAlias
    Specifies that smoothing is applied using an 8 X 4 box filter.

    SmoothingModeAntiAlias8x8
    Specifies that smoothing is applied using an 8 X 8 box filter.
  • hypnotize (10.03.07 13:43) [9]
    Ы, как много информации, буду изучать)
  • hypnotize (10.03.07 13:43) [10]
    Ы, как много информации, буду изучать) спасибо
  • hypnotize (10.03.07 13:43) [11]
    Ы, как много информации, буду изучать) спасибо
  • Степан (11.03.07 22:11) [12]
    Ы... а может ненадо... GDI рулит!
  • Степан (11.03.07 22:16) [13]

    function DrawAlphaBitmap(const Canvas: TCanvas; var ColorBitmap,
     MaskBitmap: TBitmap; X, Y: Integer): Boolean;

    type
     TArray = array [0..0] of Integer;

     function GetGradientColor(Color1, Color2: TColor; BlockCount, BlockIndex:
       Integer): TColor;
     var
       DifR, DifB, DifG: Integer;
       SR, SG, SB: Integer;
     begin
       SR := Color1 and $FF;
       DifR := (Color2 and $FF) - SR;
       SG := (Color1 shr 8) and $FF;
       DifG := ((Color2 shr 8) and $FF) - SG;
       SB := (Color1 shr 16) and $FF;
       DifB:=((Color2 shr 16) and $FF) - SB;
       Result := RGB((BlockIndex * DifR) div (BlockCount - 1) + SR,
         (BlockIndex * DifG) div (BlockCount - 1) + SG,
         (BlockIndex * DifB) div (BlockCount - 1) + SB);
     end;

     function GetBitsColor(var Bits: Pointer; Width, Height: Integer;
     X, Y: Cardinal): Integer;
     begin
       Result := 0;
       try
         Result := TArray(Bits^)[Integer(X) + Integer(Y) * Width];
       except
       end;
     end;

     procedure SetBitsColor(var Bits: Pointer; Width, Height: Integer;
       X, Y: Cardinal; Color: Integer);
     begin
       try
         TArray(Bits^)[Integer(X) + Integer(Y) * Width] := Color;
       except
       end;
     end;

     function GetMaxIntensity(Color: TColor): Byte;
     var
       SR, SG, SB: Byte;
     begin
       SR := Color and $FF;
       SG := (Color shr 8) and $FF;
       SB := (Color shr 16) and $FF;
       if SR > SG then
         Result := SR
       else
         Result := SG;
       if SB > Result then
         Result := SB;
     end;

    var
     ColorBits: Pointer;
     MaskBits: Pointer;
     DestBitmap: HBITMAP;
     DestDC: HDC;
     DestBits: Pointer;
     BitmapInfo: TBitmapInfo;
     Color1, Color2, MaskColor: Integer;
     CX, CY: Integer;
    begin
     Result := False;
     if (MaskBitmap.Width < ColorBitmap.Width) or (MaskBitmap.Width <
     ColorBitmap.Width) then
       Exit;
     GetMem(ColorBits, ColorBitmap.Width * ColorBitmap.Height *
       GetDeviceCaps(ColorBitmap.Canvas.Handle, BITSPIXEL) div 8);
     BitmapInfo.bmiHeader.biSize := SizeOf(TBitmapInfoHeader);
     BitmapInfo.bmiHeader.biWidth := ColorBitmap.Width;
     BitmapInfo.bmiHeader.biHeight := - ColorBitmap.Height;
     BitmapInfo.bmiHeader.biPlanes := 1;
     BitmapInfo.bmiHeader.biBitCount := GetDeviceCaps(ColorBitmap.Canvas.Handle,
       BITSPIXEL);
     BitmapInfo.bmiHeader.biCompression := BI_RGB;
     if GetDIBits(ColorBitmap.Canvas.Handle, ColorBitmap.Handle, 0,
     ColorBitmap.Height, ColorBits, BitmapInfo, DIB_RGB_COLORS) = 0 then
       Exit;
     GetMem(MaskBits, MaskBitmap.Width * MaskBitmap.Height *
       GetDeviceCaps(MaskBitmap.Canvas.Handle, BITSPIXEL) div 8);
     BitmapInfo.bmiHeader.biSize := SizeOf(TBitmapInfoHeader);
     BitmapInfo.bmiHeader.biWidth := MaskBitmap.Width;
     BitmapInfo.bmiHeader.biHeight := - MaskBitmap.Height;
     BitmapInfo.bmiHeader.biPlanes := 1;
     BitmapInfo.bmiHeader.biBitCount := GetDeviceCaps(MaskBitmap.Canvas.Handle,
       BITSPIXEL);
     BitmapInfo.bmiHeader.biCompression := BI_RGB;
     if GetDIBits(MaskBitmap.Canvas.Handle, MaskBitmap.Handle, 0,
       MaskBitmap.Height, MaskBits, BitmapInfo, DIB_RGB_COLORS) = 0 then
       Exit;
     BitmapInfo.bmiHeader.biSize := SizeOf(TBitmapInfoHeader);
     BitmapInfo.bmiHeader.biWidth := ColorBitmap.Width;
     BitmapInfo.bmiHeader.biHeight := - ColorBitmap.Height;
     BitmapInfo.bmiHeader.biPlanes := 1;
     BitmapInfo.bmiHeader.biBitCount := 32;
     BitmapInfo.bmiHeader.biCompression := BI_RGB;
     DestBitmap := CreateDIBSection(DIB_PAL_COLORS, BitmapInfo, DIB_RGB_COLORS,
       DestBits, 0, 0);
     DestDC := CreateCompatibleDC(Canvas.Handle);
     SelectObject(DestDC, DestBitmap);
     BitBlt(DestDC, 0, 0, ColorBitmap.Width, ColorBitmap.Height, Canvas.Handle, X,
       Y, SRCCOPY);

     for CY := 0 to ColorBitmap.Height - 1 do
       for CX := 0 to ColorBitmap.Width - 1 do begin
         Color1 := GetBitsColor(DestBits, ColorBitmap.Width, ColorBitmap.Height,
           CX, CY);
         Color2 := GetBitsColor(ColorBits, ColorBitmap.Width, ColorBitmap.Height,
           CX, CY);
         MaskColor := GetBitsColor(MaskBits, MaskBitmap.Width, MaskBitmap.Height,
           CX, CY);
         Color1 := GetGradientColor(Color1, Color2, 256, GetMaxIntensity(MaskColor));
         SetBitsColor(DestBits, ColorBitmap.Width, ColorBitmap.Height, CX, CY,
           Color1);
       end;
     BitBlt(Canvas.Handle, X, Y, ColorBitmap.Width, ColorBitmap.Height, DestDC, 0,
       0, SRCCOPY);

     DeleteObject(DestBitmap);
     DeleteObject(DestDC);
     Dispose(ColorBits);
     Dispose(MaskBits);
     Result := True;
    end;



    Работает неплохо для небольших изображений :)
  • oxffff © (11.03.07 23:55) [14]

    > Ы... а может ненадо... GDI рулит!


    Ы, а Анти-Алиасинг где?
  • antonn © (12.03.07 00:22) [15]
    Через GDI можно и антиалиасинг, и альфаблендинг.
    архивчик (471Кб, сорри, там просто картинка на форме:)) - http://antonn.ru/index.php?download=5b27b304_1173648104.rar&id=e08a9dc9592d84ccbcf9b87cb4f6b0f0
    скринчик (16Кб) - http://antonn.ru/index.php?download=e8970bc8_1173648034.PNG&id=c4df3b8638bca0989914c5220e90c72a
  • antonn © (12.03.07 00:48) [16]
    в посте выше алиасинг:)
  • homm © (12.03.07 08:47) [17]
    > [15] antonn ©   (12.03.07 00:22)

    Судя по скриншоту там ресамплинг по квадрату 3х3. Я как-то пытался написать алгоритм алиасинга для элипса без ресамплинга, чисто из геометрических соображений :) По моему это должно быть более эффективно, но увы, так ничего и не получилось.
  • antonn © (12.03.07 09:02) [18]
    угу, 3*3, можно и больше присобачить, если догадаться как:)
  • oxffff © (12.03.07 10:20) [19]

    > угу, 3*3, можно и больше присобачить, если догадаться как:
    > )


    Может все таки GDI+?
 
Конференция "Media" » Вывести графику на Canvas с Anti-Aliasing'ом [D7, WinXP]
Есть новые Нет новых   [134431   +15][b:0][p:0.003]