Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Мультимедиа в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 03.02.2016, 21:11   #1
darkwellroad
Пользователь
 
Регистрация: 01.09.2013
Сообщений: 83
Восклицание EOutOfResources в VCL

В потоке создаю JPEG. Качаю в него картинку.. Создаю PNG CreateBlank и перересовываю на него. Через некоторое время работы программы ловлю:
Код:
В потоке: Test произошла ошибка: EOutOfResources сообщает об ошибке Error creating window device context
Это форма вывода ошибок в программе. Если что. Мне так удобно просто

Грешу на JPEG и PNG, т.к. есть подобные потоки и в них ошибки не возникают. Это проверено уже
Создание:
Код:
JPEG := TJPEGImage.Create;
//Скачивание.. Ничего интересного
PNG := Tpngimage.CreateBlank(COLOR_RGB, 8, JPEG.Width, JPEG.Height);
PNG.Canvas.Draw(0, 0, JPEG);
Уничтожение:
Код:
FreeAndNil(PNG);
FreeAndNil(JPEG);
Все это в try-finally. По правилам.. Может проблема именно в CreateBlank? Не работал раньше с ним.. Также проверял на утечки через ReportMemoryLeaksOnShutdown - ничего не обнаружил. Интересно ваше мнение по данной проблеме. Продолжение темы ТЫК

Последний раз редактировалось darkwellroad; 03.02.2016 в 21:14.
darkwellroad вне форума Ответить с цитированием
Старый 03.02.2016, 21:32   #2
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

Чем обусловлены именно такие значения первых двух (ColorType и Bitdepth) параметров конструктора? Чем, блин, тебе Assign() не угодил-то?
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Старый 03.02.2016, 21:41   #3
darkwellroad
Пользователь
 
Регистрация: 01.09.2013
Сообщений: 83
По умолчанию

Цитата:
Сообщение от min@y™ Посмотреть сообщение
Чем обусловлены именно такие значения первых двух (ColorType и Bitdepth) параметров конструктора? Чем, блин, тебе Assign() не угодил-то?
Сам то, блин, пробовал Assign делать в PNG из JPEG? Значения из темы взяты. Более-менее рабочий вариант.
darkwellroad вне форума Ответить с цитированием
Старый 03.02.2016, 21:51   #4
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

Цитата:
Сам то, блин, пробовал Assign делать в PNG из JPEG?
нет, не пробовал. а что, не работает? так и пиши.
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Старый 03.02.2016, 21:53   #5
darkwellroad
Пользователь
 
Регистрация: 01.09.2013
Сообщений: 83
По умолчанию

Цитата:
Сообщение от min@y™ Посмотреть сообщение
нет, не пробовал. а что, не работает? так и пиши.
Код HTML:
Cannot assign a TJPEGImage to a TPngImage.
darkwellroad вне форума Ответить с цитированием
Старый 03.02.2016, 21:55   #6
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Assign-ом через bitmap
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 03.02.2016, 21:56   #7
darkwellroad
Пользователь
 
Регистрация: 01.09.2013
Сообщений: 83
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
Assign-ом через bitmap
Почитайте темку, которую я скинул сверху. Не хочу тут все переписывать. Все перелопатил и получилось только таким способом..
darkwellroad вне форума Ответить с цитированием
Старый 03.02.2016, 22:19   #8
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Из файл в файл все конвертирует. То же самое будет и с Stream
Код:
  JPEG := TJPEGImage.Create;
  JPEG.LoadFromFile('e:\12802436_abc71642.jpg');
  Bitmap:=TBitmap.Create;
  Bitmap.Assign(JPEG);
  PNG:=TPngObject.Create;
  PNG.Assign(Bitmap);
  PNG.SaveToFile('e:\12802436_abc71642.png');
  JPEG.Free;
  Bitmap.Free;
  PNG.Free;
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 03.02.2016, 22:24   #9
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

Цитата:
Assign-ом через bitmap
согласен. Я залез в сорцы и убедился, что PNGImage не эссайнится от жпега, так авторами было задумано.
Код:
{Assigns from another object}
procedure TPngImage.Assign(Source: TPersistent);
begin
  {Being cleared}
  if Source = nil then
    ClearChunks
  {Assigns contents from another TPngImage}
  else if Source is TPngImage then
    AssignPNG(TPngImage(Source))
  {Copy contents from a TBitmap}
  {$IFDEF UseDelphi}else if Source is TBitmap then
    with TBitmap(Source) do
      AssignHandle(Handle, Transparent,
        ColorToRGB(TransparentColor)){$ENDIF}
  {Unknown source, let ancestor deal with it}
  else
    inherited;
end;
Поэтому, ТС, предлагаю 2 варианта:
1) написать наследника от TPngImage, в котором допилить метод Assign().
2) взять функцию преобразования через битмап (я только что её набрал, чтобы посмотреть, будет ли работать), вот такую:
Код:
function JpegToPng(const AJpgName, APngName: string): Boolean;
var
  jpg: TJPEGImage;
  png: TPngImage;
  bmp: TBitmap;
begin
  try
    jpg := TJPEGImage.Create;
    try
      jpg.LoadFromFile(AJpgName);
      png := TPngImage.Create;
      bmp:= TBitmap.Create();
      try
        bmp.Assign(jpg);
        png.Assign(bmp);
        png.SaveToFile(APngName);
      finally
        png.Free();
        bmp.Free();
      end;
    finally
      jpg.Free();
    end;
    Result:= True;
  except
    Result:= False;
  end;
end;
Главное теперь узнать, будет ли вылезать твой EOutOfResources.
Дерзай. О результатах сюда докладывай.
Вложения
Тип файла: zip 289008 - JpgToPng.7z.zip (484.3 Кб, 9 просмотров)
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...

Последний раз редактировалось min@y™; 03.02.2016 в 22:27.
min@y™ вне форума Ответить с цитированием
Старый 03.02.2016, 22:26   #10
darkwellroad
Пользователь
 
Регистрация: 01.09.2013
Сообщений: 83
По умолчанию

Цитата:
Сообщение от min@y™ Посмотреть сообщение
согласен. Я залез в сорцы и убедился, что PNGImage не эссайнится от жпега, так авторами было задумано.
Код:
{Assigns from another object}
procedure TPngImage.Assign(Source: TPersistent);
begin
  {Being cleared}
  if Source = nil then
    ClearChunks
  {Assigns contents from another TPngImage}
  else if Source is TPngImage then
    AssignPNG(TPngImage(Source))
  {Copy contents from a TBitmap}
  {$IFDEF UseDelphi}else if Source is TBitmap then
    with TBitmap(Source) do
      AssignHandle(Handle, Transparent,
        ColorToRGB(TransparentColor)){$ENDIF}
  {Unknown source, let ancestor deal with it}
  else
    inherited;
end;
Поэтому, ТС, предлагаю 2 варианта:
1) написать наследника от TPngImage, в котором допилить метод Assign().
2) взять функцию преобразования через битмап (я только что её набрал, чтобы посмотреть, будет ли работать), вот такую:
Код:
function JpegToPng(const AJpgName, APngName: string): Boolean;
var
  jpg: TJPEGImage;
  png: TPngImage;
  bmp: TBitmap;
begin
  try
    jpg := TJPEGImage.Create;
    try
      jpg.LoadFromFile(AJpgName);
      png := TPngImage.Create;
      bmp:= TBitmap.Create();
      try
        bmp.Assign(jpg);
        png.Assign(bmp);
        png.SaveToFile(APngName);
      finally
        png.Free();
        bmp.Free();
      end;
    finally
      jpg.Free();
    end;
    Result:= True;
  except
    Result:= False;
  end;
end;
Главное теперь узнать, будет ли вылезать твой EOutOfResources.
Дерзай. О результатах сюда докладывай.
Может и готовые есть..
darkwellroad вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
EOutOfResources with message 'Unable to insert a line' Ermowkin Общие вопросы Delphi 5 22.07.2011 14:16
VCL формы autopilot75 Помощь студентам 3 05.04.2011 03:32
Вопрос по VCL Андрей 93 Общие вопросы Delphi 1 18.12.2010 18:46
Перлы VCL Квэнди Свободное общение 7 13.02.2009 09:08
VCL Э/\bФ_}{P Свободное общение 2 21.05.2007 00:21