Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
15-1438706693
aka
2015-08-04 19:44
2016.04.17
длинная арифметика деление


2-1411397568
ВладОшин
2014-09-22 18:52
2016.04.17
с чего тут AV можно словить?


15-1439225157
Pavelnk
2015-08-10 19:45
2016.04.17
Скачивание файла, загадка


15-1438689372
xayam from work
2015-08-04 14:56
2016.04.17
Пишем здесь свои ники


2-1411216368
Tunechi1
2014-09-20 16:32
2016.04.17
Chromium Embedded Cookie





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