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

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

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 30.09.2012, 16:03   #1
-Jack-
Форумчанин
 
Регистрация: 19.04.2009
Сообщений: 368
По умолчанию загрузка рисунка в Image

Всем доброго времени суток. Задача такая:
Есть рисунок формата *.png. В нём не хватает в начале нескольких байт. Нужно не перезаписывая файл его загрузить в Image.

Каким образом это можно реализовать ?
-Jack- вне форума Ответить с цитированием
Старый 01.10.2012, 00:52   #2
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,883
По умолчанию

Прочитайте тему потоки ( Streams) в любом адекватном мануале/учебнике
Общий подход примерно такой:
Создать поток размером с файл плюс те недостающие байты, данные из файла (можно для чтения файла задействовать второй поток) записать в поток по смещению на то количество байт, сколько не хватает (т.е. установить нужную позицию смещения и писать). Выставить позицию в 0, дописать нужные байты, я надеюсь, Вы их знаете (иначе вся затея бесполезна ). Опять выставить позицию в 0 и вызвать у TImage метод LoadFromStream , передавая ему Ваш поток.
phomm вне форума Ответить с цитированием
Старый 02.10.2012, 04:03   #3
-Jack-
Форумчанин
 
Регистрация: 19.04.2009
Сообщений: 368
По умолчанию

Начал с малого ) Загрузил картинку в поток, и через TPNGObject вывел в TImage
Да, кстати, пользуюсь Delphi7
Код:
var
  F : TStream;
  png: TPNGObject;
begin
  F := TFileStream.Create('files\img.png', fmOpenRead);
  png := TPNGObject.Create;
  png.LoadFromStream(F);
  Image1.Picture.Assign(png);
  png.free;
  F.Free;
Но при попытке вывести картинку выдается ошибка "Access violation at address"

Так, всё же, в чем может быть ошибка ? Почему картинка не выводится ?

Последний раз редактировалось Stilet; 07.10.2012 в 16:34.
-Jack- вне форума Ответить с цитированием
Старый 07.10.2012, 16:34   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Хм... Наверное потому что сам Image1.Picture не создан... Это тебе скажет только пошаговка.
Я бы на твоем месте выводит на канву PaintBox-а, а не в Image.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 09.10.2012, 00:47   #5
-Jack-
Форумчанин
 
Регистрация: 19.04.2009
Сообщений: 368
По умолчанию

С этим разобрался ... всё же рисунок вывел в TImage ... С TPaintBox пока ещё не разобрался

Код:
var
  F : TStream;
  png: TPNGObject;
begin
  F := TFileStream.Create('files\img.png', fmOpenRead);
  png := TPNGObject.Create;
  png.LoadFromStream(F);
  Image1.Canvas.Draw(0,0,png);
  png.free;
  F.Free;
Решил усложнить задачку, и попробовать убрать рисунки в ресурс (*.res).

Распишу подробно, что и как делал, видимо где то что-то сделал не так
Файл img.re:
Цитата:
img RCDATA "w4p.png"
Файл переместил на brcc32.exe, создался img.RES, его переместил в папку с проектом.

В самом проекте дописал:
Код:
...
{$R img.RES}
...
var
  png: TPNGObject;
  F : TStream;
  Paint: TPaintBox;
begin
  F:= TResourceStream.Create(HInstance, 'img', RT_RCDATA);
  png := TPNGObject.Create;
  png.LoadFromStream(F);
  Image1.Canvas.Draw(0,0,png);
  Paint.Canvas.
  png.free;
  F.Free;
end;
И опять же ошибка Access violation at address...
-Jack- вне форума Ответить с цитированием
Старый 09.10.2012, 08:12   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
И опять же ошибка
Опять же на какой строке? Почему не пользуешся отладчиком?
Цитата:
Paint.Canvas.
Что это?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 09.10.2012, 21:02   #7
-Jack-
Форумчанин
 
Регистрация: 19.04.2009
Сообщений: 368
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Опять же на какой строке? Почему не пользуешся отладчиком?
ссылается на pngimage (ImageData[i] := pRGBQuad(@ImageSource[i2 * 3])^)
Код:
          {Optmize when we donґt have transparency}
          if (AlphaSource[i2] <> 0) then
            if (AlphaSource[i2] = 255) then
              ImageData[i] := pRGBQuad(@ImageSource[i2 * 3])^
            else
              with ImageData[i] do
              begin
                rgbRed := (255+ImageSource[2+i2*3] * AlphaSource[i2] + rgbRed *
                  (not AlphaSource[i2])) shr 8;
                rgbGreen := (255+ImageSource[1+i2*3] * AlphaSource[i2] +
                  rgbGreen * (not AlphaSource[i2])) shr 8;
                rgbBlue := (255+ImageSource[i2*3] * AlphaSource[i2] + rgbBlue *
                 (not AlphaSource[i2])) shr 8;
            end;
          end;
Цитата:
Сообщение от Stilet Посмотреть сообщение
Что это?
Хм ... неудачно скопировал код ...
-Jack- вне форума Ответить с цитированием
Старый 09.10.2012, 21:44   #8
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
pRGBQuad(@ImageSource[i2 * 3])^)
А это что? Каков смысл сей строки?
Т.е. я пытаюсь понять что эта строка делает, ибо уверен что нужно прописывать проверку, что возвращает @ImageSource[i2 * 3], не вылазит ли за пределы массива.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 09.10.2012, 23:23   #9
chertovich
Форумчанин
 
Аватар для chertovich
 
Регистрация: 26.07.2009
Сообщений: 489
По умолчанию

Цитата:
Сообщение от -Jack- Посмотреть сообщение
Всем доброго времени суток. Задача такая:
Есть рисунок формата *.png. В нём не хватает в начале нескольких байт. Нужно не перезаписывая файл его загрузить в Image.

Каким образом это можно реализовать ?
Я думаю, что вначале этого файла должен быть заголовок, если он поврежден то у вас не получится просто так базовыми методами загрузить.
Если в глубине души вы программист, то, следуя своим наклонностям, вы захотите написать кусок кода.
chertovich вне форума Ответить с цитированием
Старый 10.10.2012, 00:02   #10
-Jack-
Форумчанин
 
Регистрация: 19.04.2009
Сообщений: 368
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
А это что? Каков смысл сей строки?
Т.е. я пытаюсь понять что эта строка делает, ибо уверен что нужно прописывать проверку, что возвращает @ImageSource[i2 * 3], не вылазит ли за пределы массива.
строчки из компонента ... с такими дебрями мне пока не разобраться )))

Цитата:
Сообщение от chertovich Посмотреть сообщение
Я думаю, что вначале этого файла должен быть заголовок, если он поврежден то у вас не получится просто так базовыми методами загрузить.
да сейчас с целым файлом разобраться бы ...
-Jack- вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Загрузка рисунка из TStream cargo29 Мультимедиа в Delphi 17 12.07.2011 13:57
Увеличение ширины Image без растягивания рисунка artemavd Общие вопросы Delphi 20 28.01.2011 17:40
Вставка рисунка, сохраненного из Image в MS Word artemavd Общие вопросы Delphi 0 22.08.2010 14:48
Загрузка рисунка Ilya9999 Microsoft Office Excel 9 27.05.2010 21:52
Загрузка рисунка из мемо!!! Vito89 Общие вопросы Delphi 5 10.06.2009 13:48