Форум: "Начинающим";
Текущий архив: 2016.04.17;
Скачать: [xml.tar.bz2];
ВнизStretch с помощью FastDIB Найти похожие ветки
← →
Fox (2014-09-20 14:38) [0]Здравствуйте!
Есть код, который позволяет качественно изменять размеры PNG-картинки с помощью FastDIB, но только с потерей прозрачности. Подскажите как его можно изменить, чтобы поддерживалась прозрачность и полупрозрачность. Заранее спасибо!
uses PNGImage, FastDIB, FastSize;
Procedure DrawMy(X,Y:Integer;DrIn:TPNGObject;DrOut:TImage;W,H:Integer);
Var TB:TBitmap;
BMP1: TFastDIB;
BMP2: TFastDIB;
begin
BMP1 := TFastDIB.Create;
BMP2 := TFastDIB.Create;
TB := TBitmap.Create;
TB.Width :=DrIn.Width;
TB.Height:=DrIn.Height;
TB.Canvas.Draw(0,0,DrIn);
TB.PixelFormat:=pf24bit;
BMP1.LoadFromHandle(TB.Handle);
BMP2.SetSize(W,H,24);
SmoothResize24(BMP1,BMP2,rfSpline3);
BMP2.Draw(DrOut.Canvas.Handle, X, Y);
BMP1.Free;
BMP2.Free;
TB.Free;
end;
← →
invis (2014-09-20 17:21) [1]Если только для отображения, то прозрачность и так должна применяться при рисовании TPngImage в битмап:
TB.Canvas.Draw(0,0,DrIn);
Чтобы было заметнее, можно предварительно залить битмап серым или клеточками.
Или нужно потом как-то использовать альфа-канал результирующей картинки?
← →
Jo (2014-09-20 17:37) [2]>Или нужно потом как-то использовать альфа-канал результирующей картинки?
Да, теряется альфа-канал при изменении размеров картинки. То есть при рисовании на DrOut альфа-канала уже нет.
← →
junglecat (2014-09-20 18:01) [3]значит, нужно что-то типа SmoothResize32
← →
Jo (2014-09-20 18:02) [4]Пробовал, результат тот же - без прозрачности.
← →
Rouse_ © (2014-09-20 18:18) [5]
TB.PixelFormat:=pf24bit;
Тут ничего не смущает? Альфа это, на секундочку, 32 бита...
← →
Fox (2014-09-20 18:24) [6]Хорошо, что тут не так?
uses PNGImage, FastDIB, FastSize;
Procedure DrawMy(X,Y:Integer;DrIn:TPNGObject;DrOut:TImage;W,H:Integer);
Var TB:TBitmap;
BMP1: TFastDIB;
BMP2: TFastDIB;
begin
BMP1 := TFastDIB.Create;
BMP2 := TFastDIB.Create;
TB := TBitmap.Create;
TB.Width :=DrIn.Width;
TB.Height:=DrIn.Height;
TB.PixelFormat:=pf32bit;
TB.Canvas.Draw(0,0,DrIn);
BMP1.LoadFromHandle(TB.Handle);
BMP2.SetSize(W,H,32);
SmoothResize32(BMP1,BMP2,rfSpline3);
BMP2.Draw(DrOut.Canvas.Handle, X, Y);
BMP1.Free;
BMP2.Free;
TB.Free;
end;
← →
Rouse_ © (2014-09-20 18:27) [7]http://graphicsmagic.googlecode.com/svn/trunk/GraphicsMagicLib/gmImageTile.pas
← →
Rouse_ © (2014-09-20 18:29) [8]хм, вроде не совсем то...
Выложи демо проектик с текущей версией FastDIB, которую используешь. Гляну.
← →
Fox (2014-09-20 18:38) [9]Версия FastDIB 3.9
http://www.dizaak.narod.ru/Stretch0.rar
← →
Rouse_ © (2014-09-20 19:00) [10]pngimage кидай
← →
invis (2014-09-20 19:07) [11]TPngImage.Draw, как я понял, не умеет выдавать альфа-канал "как есть", надо копировать его вручную через AlphaScanline.
← →
Fox (2014-09-20 19:08) [12]http://www.dizaak.narod.ru/-PNGImage.rar
← →
Fox (2014-09-20 19:24) [13]
procedure ConvertPngToBitmap(inpng:tpngobject;var outbitmap:tbitmap);
const MaxPixelCountA=32000;
type TRGBAArray = array[0..MaxPixelCountA-1] of TRGBQuad;
PRGBAArray = ^TRGBAArray;
var rgb:prgbaarray;alp:pbytearray;i,j:integer;
begin
outbitmap:=tbitmap.create;
outbitmap.assign(inpng);
outbitmap.pixelformat:=pf32bit;
for i:=0 to outbitmap.height-1 do begin
rgb:=outbitmap.scanline[i];
alp:=inpng.alphascanline[i];
for j:=0 to outbitmap.width-1 do
rgb[j].rgbreserved:=alp[j];
end;
end;Procedure DrawMy(X,Y:Integer;DrIn:TPNGObject;DrOut:TImage;W,H:Integer);
Var TB:TBitmap;
BMP1: TFastDIB;
BMP2: TFastDIB;
c:TFColor;
i,j:Integer;
begin
BMP1 := TFastDIB.Create;
BMP2 := TFastDIB.Create;
BMP2.SetTransparent(True);
TB := TBitmap.Create;
TB.Width :=DrIn.Width;
TB.Height:=DrIn.Height;
TB.PixelFormat:=pf32bit;
ConvertPngToBitmap(DrIn,TB);
BMP1.LoadFromHandle(TB.Handle);
BMP2.SetSize(W,H,32);
SmoothResize32(BMP1,BMP2,rfSpline3);
BMP2.Draw(DrOut.Canvas.Handle, X, Y);
BMP1.Free;
BMP2.Free;
TB.Free;
end;
Не помогло.
← →
invis (2014-09-20 19:30) [14]Ну я и не говорил, что только в этом проблема.
Ещё в этих местах альфа может теряться:
1) BMP1.LoadFromHandle(TB.Handle);
2) BMP2.Draw(DrOut.Canvas.Handle, X, Y);
поскольку это GDI, а у GDI с альфой вообще плохо.
Можно сделать так:
function CreateFDIBRef(b : TBitmap): TFastDIB;
Const pf : array[TPixelFormat] of Integer =
(0, 1, 4, 8, 16, 16, 24, 32, 0);
Var cm : TFColor;
begin
b.HandleType := bmDIB;
Result := TFastDIB.Create;
Case b.PixelFormat of
pf15bit : cm := FRGB(5,5,5);
pf16bit : cm := FRGB(5,6,5);
else cm := tfBlack;
end;
Result.SetInterface(b.ScanLine[b.Height-1], b.Width, b.Height, pf[b.PixelFormat],
cm.r, cm.g, cm.b);
If (Result.Bpp <= 8) and (b.Palette <> 0) then
GetPaletteEntries(b.Palette, 0, (1 shl Result.Bpp), Result.Colors^);
end;
Procedure DrawMy(X,Y:Integer;DrIn:TPNGObject;DrOut:TImage;W,H:Integer);
<...>
With DrOut.Picture.Bitmap do begin
PixelFormat := pf32bit;
Width := W; Height := h;
end;
Bmp1 := CreateFDIBRef(TB);
Bmp2 := CreateFDIBRef(DrOut.Picture.Bitmap);
SmoothResize32(BMP1,BMP2,rfSpline3);
Bmp2.Free;
Bmp1.Free;
<...>
← →
Fox (2014-09-20 19:43) [15]Что-то вообще ничего не рисуется теперь...
← →
Rouse_ © (2014-09-20 19:59) [16]Ну где происходит потеря альфаканала теперь в принципе понятна, не понятно что бы тебе хорошее посоветовать чтобы было для тебя удобно.
Вариант использования GDI++, вместо FastDIB и PNGImage не рассматривается?
← →
Rouse_ © (2014-09-20 20:02) [17]ЗЫ: Я не говорю что оба этих фреймфорка нельзя совместить (вероятно как-то можно) просто ранее я с ними работал и из-за энного количества неудобств для меня, от FastDIB отказался в пользу GDI+
← →
Fox (2014-09-20 20:11) [18]Возможно, GDI+ выход, нельзя ли привести пример кода с загрузкой 32-битного PNG из ресурса, качественного изменения размера и вывода куда-нибудь? Был бы очень признателен.
← →
Rouse_ © (2014-09-20 20:22) [19]Не нашел оригинала, откуда качал - поэтому выкладываю сам архив, там все найдется: http://rouse.drkb.ru/tmp/gdiplus.zip
← →
Fox (2014-09-20 20:39) [20]Буду разбираться, спасибо!
← →
Fox (2014-09-20 21:33) [21]Качество изменения размера GDI+ гораздо хуже FastDIB. Если конечно нет других вариантов:
Graph.DrawImage(in_img, MakeRect(0, 0, 105, 105), 0, 0, 256, 256, UnitPixel);
← →
junglecat (2014-09-20 21:41) [22]> Качество изменения размера GDI+ гораздо хуже FastDIB
GdipSetInterpolationMode?
← →
Rouse_ © (2014-09-20 21:47) [23]Вот этот пример смотрел?
...\gdiplus\demos\Using Images, Bitmaps, and Metafiles\Creating Thumbnail Images\
← →
Rouse_ © (2014-09-20 21:48) [24]Ну и вообще все из папки "Using Images, Bitmaps, and Metafiles"
← →
Fox (2014-09-20 21:53) [25]Вот код:
GdipSetInterpolationMode(Graph, InterpolationModeHighQualityBicubic);
Graph.DrawImage(in_img, MakeRect(0, 0, 105, 105), 0, 0, 256, 256, UnitPixel);
Сверху рисунок на GDI+, снизу - FastDIB. Ну сильно хуже на GDI+!!!
http://www.dizaak.narod.ru/test.png
← →
junglecat (2014-09-20 21:58) [26]я бы поигрался с TGPGraphics.SetInterpolationMode / SetSmoothingMode
← →
Fox (2014-09-20 22:04) [27]>Rouse_
С GetThumbnailImage не лучше.
>junglecat
Поигрался. Пока результат не лучше.
← →
Rouse_ © (2014-09-20 22:06) [28]Ого, действительно сильно хуже... но так быть не должно.
Вот здесь я работаю с данными в PNG формате у иконок, содержащих изображения размером 256 на 256 пикселей: http://rouse.drkb.ru/components.php#fwiconex
Таких артефактов точно не наблюдается.
Обрати внимание на вызовы функций и их параметры, вполне возможно что у тебя что-то напутано.
← →
Rouse_ © (2014-09-20 22:08) [29]с
function TFWCustomIconEx.GetBitmapInfo
начинай смотреть
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2016.04.17;
Скачать: [xml.tar.bz2];
Память: 0.51 MB
Время: 0.002 c