![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
|
Не могу найти нормально работающего примера, чтобы качественно увеличить PNG с alpha-каналом.
Delphi XE2 На сайте абракадабры (EDN>>CodeCentral) есть примеры работы с PNG: http://cc.embarcadero.com/Item/25631, в том числе и есть пример процедуры SmoothResize. Там есть такой кусок кода: Код:
if not (apng.Header.ColorType in [COLOR_RGBALPHA, COLOR_RGB]) then
raise Exception.Create('Only COLOR_RGBALPHA and COLOR_RGB formats' +
' are supported');Проблема в том, что у меня изображение имеет apng.Header.ColorType равный 3, а именно COLOR_PALETTE Код:
unit Vcl.Imaging.pngimage;
...
....
{Avaliable color modes for PNG}
COLOR_GRAYSCALE = 0;
COLOR_RGB = 2;
COLOR_PALETTE = 3;
COLOR_GRAYSCALEALPHA = 4;
COLOR_RGBALPHA = 6;поэтому вываливается Exception Я с изображениями вообще не работал. Поэтому нужна процедура изменения размера PNG. Или как "конвертировать" существующее изображение, чтобы эта процедура схавала мой png и не подавилась? Может можно как сконвертировать изображение из COLOR_PALETTE в COLOR_RGBALPHA или в COLOR_RGB? |
|
#2
|
||||
|
||||
|
GDI+ пробовал?
|
|
#3
|
|||
|
|||
|
Нет.
Попробую, если найду нормальный рабочий готовый пример. |
|
#4
|
||||
|
||||
|
попробуй это:
-просто запустить "Project1.exe" -масштабирует в 2 раза файл "Google.png" (в одном каталоге с программой) -результат файл "Google+.png" |
|
#5
|
|||
|
|||
|
Работает как надо.
Но готовый примерчик бы поиметь вместо exe ![]() |
|
#6
|
|||
|
|||
|
Нашёл вот такой код
Код:
uses GDIPAPI, GDIPOBJ,GDIPUTIL;
procedure TForm11.Button1Click(Sender: TObject);
var
in_img, out_img: TGPImage;
g: TGPGraphics;
out_width, out_height: Integer;
sclx:extended; fname:string;
encoderClsid: TGUID;
begin
fname:='D:\test.png';
out_width := 450;
in_img := TGPImage.Create(fname);
sclx:=450/in_img.GetWidth;
if sclx <> 1 then
begin
out_height := round(in_img.GetHeight*sclx);
out_img := TGPBitmap.Create(out_width, out_height);
g := TGPGraphics.Create(out_img);
g.DrawImage(in_img, MakeRect(0, 0, out_width, out_height), 0, 0, in_img.GetWidth, in_img.GetHeight, UnitPixel);
g.Destroy;
in_img.Free; //иначе надо сохранять не в (fname) а (NOTfname)
GetEncoderClsid('image/png', encoderClsid);
out_img.Save(fname, encoderClsid);
end;
end;тестирую |
|
#7
|
|||
|
|||
|
Цитата:
Можно на Ваш код глянуть? Можно ли в нём работать не через файл? Мне нужно работать без физического файла. Я скачиваю из интернета картинку и увеличиваю размер, затем записываю TMemoryStream в базу. |
|
#8
|
|||
|
|||
|
Практически такая-же проблема. Использую TPNGObject (другого не предлагать).
Скачивается файл .png с ColorType COLOR_PALETTE. Нужно обращаться к Alpha-пикселям, но при AlphaScanline появляется ошибка. Есть ли какие-то способы перевести ColorType в COLOR_RGBALPHA? |
|
#9
|
||||
|
||||
|
В старых версиях Дельфи PNGObject, в новых PNGImage.
Код:
var
png, png_a : TPNGImage;
procedure TForm4.FormCreate(Sender: TObject);
begin
png := TPNGImage.Create;
png.LoadFromFile('bud256.png');
png_a := TPNGImage.CreateBlank(COLOR_RGBALPHA, 8, png.Width, png.Height);
png_a.Assign(png);
png_a.SaveToFile('bud256_A.png');
end;другой вариант: Код:
Image1.Picture.LoadFromFile('bud256.png');
png := TPNGImage.Create;
png.LoadFromFile('bud256.png');
png.CreateAlpha;
png.TransparentColor := clWhite;
png.SaveToFile('bud256_A.png');Последний раз редактировалось angvelem, 15.08.2012 в 03:42. |
|
#10
|
|||
|
|||
|
Цитата:
см. эту тему http://forum.vingrad.ru/forum/topic-354907.html там есть готовые процедуры и функции, примеры |