-
Здратвуйте Мастера! Не знает ли кто-нибудь из присутвующих как выводить на Канву графику (с Трансперентом) со сглаживанием (Анти-Алиасингом)? То есть нету ли какого либо аналога процедуры Canvas.Draw(x,y,graphic); только, со сглаживанием)
-
Аналога нет, и уточни что тебе надо рисовать? Картинку или примитивы?
-
Разве картинку возможно выводить с антиальясингом? По сабжу ничего не скажу, погугли, для С++ имеется библиотека с такими штуками.
-
Может нужна 32-х битная картинка? Тогда смотри AlphaBlend или пиши свою процедуру!
-
Выводить нужно Bitmap с Transperent:=true; (невидимая часть фиолетовым цветом закрашена) , но после вывода очень заметны грани, нельзя ли их сгладить как нить? Дело в том что я сам не понимаю принцип работы Анти Алиасинга, я нашел в инете один примерчик, но он жуууутко тормозит. А как отрисовать картинку с AlphaBlend'ом?
-
Тебе поможет 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. } { } { *****************************************************************}
-
Есть eще GDI функции BitBlt,MaskBlt,StretchBlt.
-
Если тебе нужен Анти-Алиасинг тогда используй 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.
Вот и все.
-
Анти-Алиас здесь 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.
-
Ы, как много информации, буду изучать)
-
Ы, как много информации, буду изучать) спасибо
-
Ы, как много информации, буду изучать) спасибо
-
Ы... а может ненадо... GDI рулит!
-
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;
Работает неплохо для небольших изображений :)
-
> Ы... а может ненадо... GDI рулит!
Ы, а Анти-Алиасинг где?
-
-
в посте выше алиасинг:)
-
> [15] antonn © (12.03.07 00:22)
Судя по скриншоту там ресамплинг по квадрату 3х3. Я как-то пытался написать алгоритм алиасинга для элипса без ресамплинга, чисто из геометрических соображений :) По моему это должно быть более эффективно, но увы, так ничего и не получилось.
-
угу, 3*3, можно и больше присобачить, если догадаться как:)
-
> угу, 3*3, можно и больше присобачить, если догадаться как: > )
Может все таки GDI+?
|