Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Графика и игры
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 01.08.2012, 15:27
Akella225 Akella225 вне форума
Прохожий
 
Регистрация: 01.08.2012
Адрес: UA
Сообщения: 11
Версия Delphi: 2007, XE2
Репутация: 10
По умолчанию Конвертировать PNG ColorType из COLOR_PALETTE

Не могу найти нормально работающего примера, чтобы качественно увеличить 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  
Старый 01.08.2012, 16:01
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

GDI+ пробовал?
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #3  
Старый 01.08.2012, 16:05
Akella225 Akella225 вне форума
Прохожий
 
Регистрация: 01.08.2012
Адрес: UA
Сообщения: 11
Версия Delphi: 2007, XE2
Репутация: 10
По умолчанию

Нет.
Попробую, если найду нормальный рабочий готовый пример.
Ответить с цитированием
  #4  
Старый 01.08.2012, 16:35
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

попробуй это:
-просто запустить "Project1.exe"
-масштабирует в 2 раза файл "Google.png" (в одном каталоге с программой)
-результат файл "Google+.png"
Вложения
Тип файла: rar GdiplusPNG.rar (38.5 Кбайт, 12 просмотров)
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #5  
Старый 01.08.2012, 16:49
Akella225 Akella225 вне форума
Прохожий
 
Регистрация: 01.08.2012
Адрес: UA
Сообщения: 11
Версия Delphi: 2007, XE2
Репутация: 10
Хорошо

Работает как надо.
Но готовый примерчик бы поиметь вместо exe
Ответить с цитированием
  #6  
Старый 01.08.2012, 17:11
Akella225 Akella225 вне форума
Прохожий
 
Регистрация: 01.08.2012
Адрес: UA
Сообщения: 11
Версия Delphi: 2007, XE2
Репутация: 10
По умолчанию

Нашёл вот такой код
Код:
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;
http://kachkarvv.org.ua/faq/src-delp...pg-gdi-rsz.php
тестирую
Ответить с цитированием
  #7  
Старый 01.08.2012, 17:19
Akella225 Akella225 вне форума
Прохожий
 
Регистрация: 01.08.2012
Адрес: UA
Сообщения: 11
Версия Delphi: 2007, XE2
Репутация: 10
По умолчанию

Цитата:
Сообщение от NumLock
попробуй это:
-просто запустить "Project1.exe"
-масштабирует в 2 раза файл "Google.png" (в одном каталоге с программой)
-результат файл "Google+.png"

Можно на Ваш код глянуть?
Можно ли в нём работать не через файл?

Мне нужно работать без физического файла.
Я скачиваю из интернета картинку и увеличиваю размер, затем записываю TMemoryStream в базу.
Ответить с цитированием
  #8  
Старый 15.08.2012, 00:12
Radical Radical вне форума
Прохожий
 
Регистрация: 04.04.2012
Сообщения: 14
Репутация: 10
По умолчанию

Практически такая-же проблема. Использую TPNGObject (другого не предлагать).
Скачивается файл .png с ColorType COLOR_PALETTE.
Нужно обращаться к Alpha-пикселям, но при AlphaScanline появляется ошибка.
Есть ли какие-то способы перевести ColorType в COLOR_RGBALPHA?
Ответить с цитированием
  #9  
Старый 15.08.2012, 03:34
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

В старых версиях Дельфи 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');
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.

Последний раз редактировалось angvelem, 15.08.2012 в 03:42.
Ответить с цитированием
  #10  
Старый 15.08.2012, 11:50
Akella225 Akella225 вне форума
Прохожий
 
Регистрация: 01.08.2012
Адрес: UA
Сообщения: 11
Версия Delphi: 2007, XE2
Репутация: 10
Хорошо

Цитата:
Сообщение от Radical
Практически такая-же проблема. Использую TPNGObject (другого не предлагать).
Скачивается файл .png с ColorType COLOR_PALETTE.
Нужно обращаться к Alpha-пикселям, но при AlphaScanline появляется ошибка.
Есть ли какие-то способы перевести ColorType в COLOR_RGBALPHA?


см. эту тему
http://forum.vingrad.ru/forum/topic-354907.html
там есть готовые процедуры и функции, примеры
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 09:33.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter