Модераторы: Snowy, Alexeis, MetalFan

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Изменить размер PNG 
:(
    Опции темы
Illusion Dolphin
Дата 2.8.2012, 22:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1198
Регистрация: 3.5.2003

Репутация: 13
Всего: 63



А вот и обновление, проверил со всеми вроде бы возможными форматами для COLOR_PALETTE:
Код


procedure LoadPNGImagePalette(PNG: TPNGImage; Bitmap: TBitmap);
var
  I, J: Integer;
  P: Byte;
  DeltaS, DeltaD: Integer;
  AddrLineS, AddrLineD: NativeInt;
  AddrS, AddrD: NativeInt;
  Chunk: TChunkPLTE;
  TRNS: TChunktRNS;
  BitDepth, BitDepthD8,
  Rotater, ColorMask: Byte;
begin
  if PNG.Transparent then
    Bitmap.PixelFormat := pf32bit
  else
    Bitmap.PixelFormat := pf24bit;

  Bitmap.SetSize(PNG.Width, PNG.Height);

  AddrLineS := NativeInt(PNG.ScanLine[0]);
  AddrLineD := NativeInt(Bitmap.ScanLine[0]);
  DeltaS := 0;
  DeltaD := 0;
  if PNG.Height > 1 then
  begin
    DeltaS := NativeInt(PNG.ScanLine[1]) - AddrLineS;
    DeltaD := NativeInt(Bitmap.ScanLine[1])- AddrLineD;
  end;

  BitDepth := PNG.Header.BitDepth; //1,2,4,8 only, 16 not supported by PNG specification

  //{2 bits for each pixel is not supported by windows bitmap} -> see PNG implementation
  if BitDepth = 2 then
    BitDepth := 4;

  BitDepthD8 := 8 - BitDepth;
  ColorMask := (255 shl BitDepthD8) and 255;

  Chunk := TChunkPLTE(PNG.Chunks.ItemFromClass(TChunkPLTE));
  if not PNG.Transparent then
  begin
    for I := 0 to PNG.Height - 1 do
    begin
      AddrS := AddrLineS;
      AddrD := AddrLineD;
      Rotater := 0;
      for J := 0 to PNG.Width - 1 do
      begin
        Rotater := J * BitDepth mod 8;

        P := ((PByte(AddrS + (J * BitDepth) div 8)^ shl Rotater) and ColorMask) shr BitDepthD8;

        with Chunk.Item[P] do
        begin
          PRGB(AddrD)^.R := PNG.GammaTable[rgbRed];
          PRGB(AddrD)^.G := PNG.GammaTable[rgbGreen];
          PRGB(AddrD)^.B := PNG.GammaTable[rgbBlue];
        end;

        Inc(AddrD, 3);
      end;
      Inc(AddrLineS, DeltaS);
      Inc(AddrLineD, DeltaD);
    end;
  end else
  begin
    TRNS := PNG.Chunks.ItemFromClass(TChunktRNS) as TChunktRNS;
    for I := 0 to PNG.Height - 1 do
    begin
      AddrS := AddrLineS;
      AddrD := AddrLineD;
      Rotater := 0;
      for J := 0 to PNG.Width - 1 do
      begin
        Rotater := J * BitDepth mod 8;

        P := ((PByte(AddrS + (J * BitDepth) div 8)^ shl Rotater) and ColorMask) shr BitDepthD8;

        with Chunk.Item[P] do
        begin
          PRGB32(AddrD)^.R := PNG.GammaTable[rgbRed];
          PRGB32(AddrD)^.G := PNG.GammaTable[rgbGreen];
          PRGB32(AddrD)^.B := PNG.GammaTable[rgbBlue];
          PRGB32(AddrD)^.L := TRNS.PaletteValues[P]; //set directly to 255 to disable transparency
        end;

        Inc(AddrD, 4);
      end;
      Inc(AddrLineS, DeltaS);
      Inc(AddrLineD, DeltaD);
    end;
  end;
end;


Добавлено @ 22:10
x128, В твоём коде есть пара моментов:
1) Не thread-safe (если, конечно, это не требуется). В моём случае это поддерживается.
2) Не работает с некоторыми изображениями (если это важно - в аттаче пример).

Это сообщение отредактировал(а) Illusion Dolphin - 2.8.2012, 22:35

Присоединённый файл ( Кол-во скачиваний: 16 )
Присоединённый файл  basn0g02.png 0,10 Kb


--------------------
В мире всего две бесконечности: вселенная и человеческая глупость... На счёт вселенной я не уверен.
Шифрование и организация фотографий - Photo Database 4.5
PM MAIL WWW ICQ   Вверх
x128
Дата 2.8.2012, 23:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 88
Регистрация: 29.9.2009

Репутация: 5
Всего: 7



Цитата(Illusion Dolphin @  2.8.2012,  22:02 Найти цитируемый пост)
Не работает с некоторыми изображениями (если это важно - в аттаче пример).

Действительно, что-то я с COLOR_GRAYSCALE тормознул...


Присоединённый файл ( Кол-во скачиваний: 22 )
Присоединённый файл  PNGResize.zip 277,31 Kb
PM MAIL WWW   Вверх
Akella
Дата 3.8.2012, 09:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 1
Всего: 329



Цитата(x128 @ 2.8.2012,  21:50)
Хм... Заметил странную особенность, StretchBlt в режиме HALFTONE не сглаживает приложенную картинку при увеличении... Но это мелочи. Меня больше интересует, зачем нужно эту картинку обрабатывать с прозрачностью и зачем работать с PNG напрямую? Я так полагаю, что будет какая-то обработка и скорее всего распознавание и в таком случае достаточно получить битмап и без прозрачности.
Код

var
  bmp: TBitmap;
  png: TPNGObject;
...
  bmp:=TBitmap.Create;
  bmp.PixelFormat:=pf24bit;
  bmp.SetSize(png.Width, png.Height);
  with bmp.Canvas do  
    Brush.Color:=clWhite;
    FillRect(ClipRect);
    Draw(0,0,png);
  end;

Да, имеено bitmap я в итоге и хочу получить!! Нормальный, читабельный bitmap.
Теми простыми способами через <TImage>.Picture.Graphic с пересохранением, получается плохо. Компонента распознавания видиц цифры, но плохо распознает. А когда я исходный png конвертирую в bitmap с помощью ACDSee, то компонента распознавания прекрасно распознает, почти на 100%. Автор компоненты,которую я купил (winsoае ocr) молчит, никаких рекомендаций не даёт.
PM MAIL   Вверх
Akella
Дата 3.8.2012, 09:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 1
Всего: 329



Illusion Dolphin, ты так и не ответил, что за prgb и prgb32
PM MAIL   Вверх
Akella
Дата 3.8.2012, 09:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 1
Всего: 329



Цитата(x128 @ 2.8.2012,  23:39)
Цитата(Illusion Dolphin @  2.8.2012,  22:02 Найти цитируемый пост)
Не работает с некоторыми изображениями (если это важно - в аттаче пример).

Действительно, что-то я с COLOR_GRAYSCALE тормознул...

x128, почему на этой строке  src принимает значение nil
Код
src:=png.AlphaScanline[y];


вызываю так:
Код

      png.LoadFromStream(img_stream);
      ResizePNG(png, png.Width * 2, png.Height * 2, true);

PM MAIL   Вверх
x128
Дата 3.8.2012, 11:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 88
Регистрация: 29.9.2009

Репутация: 5
Всего: 7



Цитата(Akella @  3.8.2012,  09:58 Найти цитируемый пост)
 почему на этой строке  src принимает значение nil

Скорее всего, изображение не имеет альфа-канала. Перед вызовом ResizePNG, нужно преобразовать PNG через ConvertToRGBA. И еще, ResizePNG в это функция которая возвращает новый PNG, эсли ты не переделывал, то вызов должен быть другим.
Код

      var
         tmp: TPNGObject;
...
      png.LoadFromStream(img_stream);
      ConvertToRGBA(png);
      tmp:=ResizePNG(png, png.Width * 2, png.Height * 2, true);


Это сообщение отредактировал(а) x128 - 3.8.2012, 11:25
PM MAIL WWW   Вверх
Akella
Дата 3.8.2012, 11:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 1
Всего: 329



Цитата(x128 @  3.8.2012,  11:14 Найти цитируемый пост)
Скорее всего, изображение не имеет альфа-канала. Перед вызовом ResizePNG, нужно преобразовать PNG через ConvertToRGBA


но там тоже есть код:

Код

        src:=png.Scanline[y];
...
...
            8: i:=src[x];

PM MAIL   Вверх
x128
Дата 3.8.2012, 11:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 88
Регистрация: 29.9.2009

Репутация: 5
Всего: 7



Цитата(Akella @  3.8.2012,  11:31 Найти цитируемый пост)
но там тоже есть код:

Scanline и AlphaScanline немного разные вещи. Процедура ConvertToRGBA преобразовывает png в COLOR_RGBALPHA, а функция ResizePNG работает исключительно с этим форматом. Переписать можно как нужно или удобно, я просто хотел наглядно показать что и как.
PM MAIL WWW   Вверх
Akella
Дата 3.8.2012, 12:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 1
Всего: 329



ага понял, спасибо

Добавлено через 1 минуту и 30 секунд
Теперь вопрос по преобразованию в BMP.

Вот мой код

Код

      png.LoadFromStream(img_stream);
      ConvertToRGBA(png);
      SmoothResize(png, png.Width * 3, png.Height * 3);
      png.SetSize(png.Width + 2, png.Height + 2);
      png.SaveToFile('d:\png.png');
      Ocr1.Picture.Bitmap.PixelFormat := pf24bit;
      Ocr1.Picture.Bitmap.Assign(png);
      Ocr1.Picture.Bitmap.SaveToFile('d:\bmp.bmp');


в итоге картинка bmp выглядит не совсем читабельно: 

user posted image

как бы мне прозрачность перевести в белый цвет?
PM MAIL   Вверх
x128
Дата 3.8.2012, 14:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 88
Регистрация: 29.9.2009

Репутация: 5
Всего: 7



как-то так:
Код

      png.LoadFromStream(img_stream);
      ConvertToRGBA(png);
      SmoothResize(png, png.Width * 3, png.Height * 3);
      png.SetSize(png.Width + 2, png.Height + 2);
      png.SaveToFile('d:\png.png');
      with Ocr1.Picture.Bitmap do begin
        PixelFormat := pf24bit;
        SetSize(png.Width, png.Height);
        with Canvas do begin
          Brush.Color:=clWhite;
          FillRect(ClipRect);
          Draw(0,0,png);
        end;
        SaveToFile('d:\bmp.bmp');
      end;

PM MAIL WWW   Вверх
Akella
Дата 3.8.2012, 15:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 1
Всего: 329



Да вы просто шайтаны  smile  smile  smile 
PM MAIL   Вверх
Illusion Dolphin
Дата 4.8.2012, 15:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1198
Регистрация: 3.5.2003

Репутация: 13
Всего: 63



Вроде уже что надо было получили, но раз вопрос есть отвечу smile
Цитата

ты так и не ответил, что за prgb и prgb32 

Это описание пиксела для 24 и 32 битных битмапов, вот описание полное:
Код

type
  TRGB = record
    B, G, R : Byte;
  end;

  ARGB = array [0..32677] of TRGB;
  PARGB = ^ARGB;
  PRGB = ^TRGB;
  PARGBArray = array of PARGB;

  TRGB32 = record
    B, G, R, L : byte;
  end;

  ARGB32 = array [0..32677] of TRGB32;
  PARGB32 = ^ARGB32;
  PRGB32 = ^TRGB32;
  PARGB32Array = array of PARGB32;


Я смотрю тут автоматизатор капчи делается, не знаю какое их количество, но если много или они не из главного потока обрабатываются то код с канвой будет раз на 10 случаев (приблизительно) выдавать пустой результат.  

Цитата

как бы мне прозрачность перевести в белый цвет? 


Применимо к моему коду там есть коментарий - "//set directly to 255 to disable transparency" - вот если проверить тут прозрачность то можно делать фон любого цвета устанавливая другие значения и если надо через прозрачность:
Код

PRGB(AddrD)^.R := (PNG.GammaTable[rgbRed] * (255 - TRNS.PaletteValues[P]) + 255 * TRNS.PaletteValues[P] + $7F) div $FF;



--------------------
В мире всего две бесконечности: вселенная и человеческая глупость... На счёт вселенной я не уверен.
Шифрование и организация фотографий - Photo Database 4.5
PM MAIL WWW ICQ   Вверх
Akella
Дата 6.8.2012, 09:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 1
Всего: 329



Цитата(Illusion Dolphin @  4.8.2012,  15:38 Найти цитируемый пост)
Я смотрю тут автоматизатор капчи делается

нет, распознавать на картинках нужно номера телефонов smile
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Звук, графика и видео"
Girder
Snowy
Alexeis

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делится вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • По вопросам разработки игр стоит заглянуть сюда

FAQ раздела лежит здесь!


Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Girder, Snowy.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Звук, графика и видео | Следующая тема »


 




[ Время генерации скрипта: 0.0919 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.