Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Копировать часть Png изображения в другой png


Автор: Vaskevych 14.3.2012, 23:11
Помогите написать ф-ю для копирования одной части рисунка в другой новый файл при етом сохраняя прозрачность:

вот нашел такую ф-юю но она упрямо не хочет работать или я делаю че не так

Код

function CopyPNG(const PNG: TPNGObject; const R: TRect): TPNGObject; 
 Var 
   i, Xmax, Ymax: integer; 
 Begin 
   Xmax := R.Right-r.Left; 
   Ymax :=R.Bottom-r.Top; 
   Result := TPNGObject.CreateBlank(COLOR_RGBALPHA, 8, Xmax, Ymax); 
   BitBlt(Result.Canvas.Handle, 0, 0, Xmax, Ymax, PNG.Canvas.Handle, R.Left, R.Top, SRCCOPY); 
   For i := 0 to Ymax-1 do 
     CopyMemory(Result.AlphaScanline[i], pByte(dword(PNG.AlphaScanline[i+R.Top])+R.Left), Xmax); 
 End;


Здесь ветка на форуме http://forum.vingrad.ru/forum/topic-308175/view-all.html

Почему она не работает ???? 

Автор: MetalFan 15.3.2012, 11:34
Цитата(Vaskevych @  14.3.2012,  23:11 Найти цитируемый пост)
она упрямо не хочет работать или я делаю че не так

Какие симптомы? Возможно у исходного изображения нет альфаканала и код просто валится с AV.

Автор: Vaskevych 15.3.2012, 21:16
Просто валится с AV, вообще блин афигеваю.

Автор: Vaskevych 16.3.2012, 01:19
Все наконецто розобрался просто надо принудительно добавить инфу о прозрачности


Код

Procedure CutPNG(Source: TPNGImage; OutPNG: TPNGImage; R: TRect);
Var
   i,xmax,ymax: integer;
   Inside: TPNGImage;
Begin
   Source.CreateAlpha;
   xmax := r.Right - r.Left;
   ymax := r.Bottom - r.Top;
   Inside := TPNGImage.CreateBlank(COLOR_RGBALPHA,8,xmax,ymax);
   BitBlt(Inside.Canvas.Handle,0,0,xmax,ymax,Source.Canvas.Handle,R.Left,R.Top,SRCCOPY);
   For i := 0 To ymax - 1 Do
      CopyMemory(Inside.AlphaScanline[i],pByte(dword(Source.AlphaScanline[i + R.Top]) + R.Left),xmax);
   OutPNG.Assign(Inside);
   FreeAndNil(Inside);
End;

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)