### Home Classes Methods

### In Files

- lib/origami/graphics/xobject.rb

### Parent

Origami::Stream

### Methods

- ::from_image_file
- #to_image_file

### Included Modules

- Origami::Graphics::XObject

### Class/Module Index

Quicksearch

- Origami
- Origami::Action
- Origami::Action::GoTo
- Origami::Action::GoToE
- Origami::Action::GoToE::EmbeddedTarget
- Origami::Action::GoToE::EmbeddedTarget::Relationship
- Origami::Action::GoToR
- Origami::Action::ImportData
- Origami::Action::JavaScript
- Origami::Action::Launch
- Origami::Action::Launch::WindowsLaunchParams
- Origami::Action::Named
- Origami::Action::RichMediaExecute
- Origami::Action::RichMediaExecute::Command
- Origami::Action::SubmitForm
- Origami::Action::SubmitForm::Flags
- Origami::Action::URI
- Origami::Adobe
- Origami::Adobe::PPKLite
- Origami::Adobe::PPKLite::AddressList
- Origami::Adobe::PPKLite::Catalog
- Origami::Adobe::PPKLite::Certificate
- Origami::Adobe::PPKLite::Certificate::Flags
- Origami::Adobe::PPKLite::Descriptor
- Origami::Adobe::PPKLite::Header
- Origami::Adobe::PPKLite::PPK
- Origami::Adobe::PPKLite::Parser
- Origami::Adobe::PPKLite::Revision
- Origami::Adobe::PPKLite::User
- Origami::Adobe::PPKLite::UserList
- Origami::AnimationStyle3D
- Origami::AnimationStyle3D::Styles
- Origami::Annotation
- Origami::Annotation::AdditionalActions
- Origami::Annotation::AppearanceCharacteristics
- Origami::Annotation::AppearanceCharacteristics::CaptionStyle
- Origami::Annotation::AppearanceDictionary
- Origami::Annotation::AppearanceStream
- Origami::Annotation::Artwork3D
- Origami::Annotation::Artwork3D::Activation
- Origami::Annotation::Artwork3D::Activation::Events
- Origami::Annotation::Artwork3D::Activation::State
- Origami::Annotation::BorderStyle
- Origami::Annotation::Circle
- Origami::Annotation::FileAttachment
- Origami::Annotation::FileAttachment::Icons
- Origami::Annotation::Flags
- Origami::Annotation::FreeText
- Origami::Annotation::FreeText::Intent
- Origami::Annotation::Link
- Origami::Annotation::Link::Highlight
- Origami::Annotation::Markup
- Origami::Annotation::RichMedia
- Origami::Annotation::RichMedia::Activation
- Origami::Annotation::RichMedia::Animation
- Origami::Annotation::RichMedia::Configuration
- Origami::Annotation::RichMedia::Content
- Origami::Annotation::RichMedia::CuePoint
- Origami::Annotation::RichMedia::Deactivation
- Origami::Annotation::RichMedia::Instance
- Origami::Annotation::RichMedia::Parameters
- Origami::Annotation::RichMedia::Parameters::Binding
- Origami::Annotation::RichMedia::Position
- Origami::Annotation::RichMedia::Presentation
- Origami::Annotation::RichMedia::Settings
- Origami::Annotation::RichMedia::Window
- Origami::Annotation::Screen
- Origami::Annotation::Shape
- Origami::Annotation::Sound
- Origami::Annotation::Sound::Icons
- Origami::Annotation::Square
- Origami::Annotation::Text
- Origami::Annotation::Text::TextName
- Origami::Annotation::Triggerable
- Origami::Annotation::Widget
- Origami::Annotation::Widget::Button
- Origami::Annotation::Widget::Button::Flags
- Origami::Annotation::Widget::CheckBox
- Origami::Annotation::Widget::Choice
- Origami::Annotation::Widget::Choice::Flags
- Origami::Annotation::Widget::ComboBox
- Origami::Annotation::Widget::Highlight
- Origami::Annotation::Widget::ListBox
- Origami::Annotation::Widget::PushButton
- Origami::Annotation::Widget::Radio
- Origami::Annotation::Widget::Signature
- Origami::Annotation::Widget::Text
- Origami::Annotation::Widget::Text::Flags
- Origami::Array
- Origami::Background3D
- Origami::Boolean
- Origami::ByteString
- Origami::Catalog
- Origami::CatalogAdditionalActions
- Origami::Console
- Origami::Console::Colors
- Origami::ContentStream
- Origami::CrossSection3D
- Origami::Destination
- Origami::Destination::GlobalBoundingBoxFit
- Origami::Destination::GlobalFit
- Origami::Destination::HorizontalBoudingBoxFit
- Origami::Destination::HorizontalFit
- Origami::Destination::RectangleFit
- Origami::Destination::VerticalBoundingBoxFit
- Origami::Destination::VerticalFit
- Origami::Destination::Zoom
- Origami::DeveloperExtension
- Origami::Dictionary
- Origami::EmbeddedFileParameters
- Origami::EmbeddedFileStream
- Origami::Encoding
- Origami::Encryption
- Origami::Encryption::AES
- Origami::Encryption::ARC4
- Origami::Encryption::CryptFilterDictionary
- Origami::Encryption::EncryptedDocument
- Origami::Encryption::EncryptedObject
- Origami::Encryption::EncryptedStream
- Origami::Encryption::EncryptedString
- Origami::Encryption::EncryptionDictionary
- Origami::Encryption::Identity
- Origami::Encryption::Standard
- Origami::Encryption::Standard::Dictionary
- Origami::Encryption::Standard::Permissions
- Origami::Extensions
- Origami::ExternalFile
- Origami::ExternalStream
- Origami::FDF
- Origami::FDF::Header
- Origami::FDF::Parser
- Origami::FDF::Revision
- Origami::Field
- Origami::Field::Flags
- Origami::Field::Subform
- Origami::Field::Subform::AdditionalActions
- Origami::Field::Subform::CertificateSeedValue
- Origami::Field::Subform::CertificateSeedValue::URL
- Origami::Field::Subform::SignatureLock
- Origami::Field::Subform::SignatureLock::Actions
- Origami::Field::Subform::SignatureSeedValue
- Origami::Field::Subform::SignatureSeedValue::Digest
- Origami::Field::TextAlign
- Origami::Field::Type
- Origami::FileSpec
- Origami::Filename
- Origami::Filter
- Origami::Filter::A85
- Origami::Filter::AHx
- Origami::Filter::ASCII85
- Origami::Filter::ASCIIHex
- Origami::Filter::CCF
- Origami::Filter::CCITTFax
- Origami::Filter::CCITTFax::DecodeParms
- Origami::Filter::ClassMethods
- Origami::Filter::Crypt
- Origami::Filter::Crypt::DecodeParms
- Origami::Filter::DCT
- Origami::Filter::DCT::DecodeParms
- Origami::Filter::Fl
- Origami::Filter::Flate
- Origami::Filter::Flate::DecodeParms
- Origami::Filter::InvalidFlateDataError
- Origami::Filter::JBIG2
- Origami::Filter::JBIG2::DecodeParms
- Origami::Filter::JPX
- Origami::Filter::LZW
- Origami::Filter::LZW::DecodeParms
- Origami::Filter::Predictor
- Origami::Filter::RL
- Origami::Filter::RunLength
- Origami::Filter::Utils
- Origami::Filter::Utils::BitReader
- Origami::Filter::Utils::BitWriter
- Origami::Font
- Origami::Font::TrueType
- Origami::Font::Type1
- Origami::Font::Type1::Standard
- Origami::Font::Type1::Standard::Courier
- Origami::Font::Type1::Standard::CourierBold
- Origami::Font::Type1::Standard::CourierBoldOblique
- Origami::Font::Type1::Standard::CourierOblique
- Origami::Font::Type1::Standard::Helvetica
- Origami::Font::Type1::Standard::HelveticaBold
- Origami::Font::Type1::Standard::HelveticaBoldOblique
- Origami::Font::Type1::Standard::HelveticaOblique
- Origami::Font::Type1::Standard::Symbol
- Origami::Font::Type1::Standard::TimesBold
- Origami::Font::Type1::Standard::TimesBoldItalic
- Origami::Font::Type1::Standard::TimesItalic
- Origami::Font::Type1::Standard::TimesRoman
- Origami::Font::Type1::Standard::ZapfDingbats
- Origami::Font::Type3
- Origami::FontDescriptor
- Origami::FontStream
- Origami::Function
- Origami::Function::Exponential
- Origami::Function::PostScript
- Origami::Function::Sampled
- Origami::Function::Stitching
- Origami::Function::Type
- Origami::Graphics
- Origami::Graphics::Canvas
- Origami::Graphics::Color
- Origami::Graphics::Color::BlendMode
- Origami::Graphics::Color::CMYK
- Origami::Graphics::Color::GrayScale
- Origami::Graphics::Color::ICCProfile
- Origami::Graphics::Color::Intent
- Origami::Graphics::Color::RGB
- Origami::Graphics::Color::Space
- Origami::Graphics::DashPattern
- Origami::Graphics::DummyCanvas
- Origami::Graphics::ExtGState
- Origami::Graphics::FormXObject
- Origami::Graphics::ImageXObject
- Origami::Graphics::InvalidColorError
- Origami::Graphics::InvalidPathError
- Origami::Graphics::LineCapStyle
- Origami::Graphics::LineJoinStyle
- Origami::Graphics::Path
- Origami::Graphics::Path::Line
- Origami::Graphics::Path::Segment
- Origami::Graphics::Pattern
- Origami::Graphics::Pattern::Shading
- Origami::Graphics::Pattern::Shading::Axial
- Origami::Graphics::Pattern::Shading::CoonsPathMesh
- Origami::Graphics::Pattern::Shading::FreeFormTriangleMesh
- Origami::Graphics::Pattern::Shading::FunctionBased
- Origami::Graphics::Pattern::Shading::LatticeFormTriangleMesh
- Origami::Graphics::Pattern::Shading::Radial
- Origami::Graphics::Pattern::Shading::ShadingObject
- Origami::Graphics::Pattern::Shading::TensorProductPatchMesh
- Origami::Graphics::Pattern::Shading::Type
- Origami::Graphics::Pattern::Tiling
- Origami::Graphics::Pattern::Tiling::PaintType
- Origami::Graphics::Pattern::Tiling::Type
- Origami::Graphics::Pattern::Type
- Origami::Graphics::ReferenceDictionary
- Origami::Graphics::State
- Origami::Graphics::TextCanvas
- Origami::Graphics::XObject
- Origami::HexaString
- Origami::HintStream
- Origami::HintTable
- Origami::HintTable::ClassMethods
- Origami::HintTable::PageOffsetTable
- Origami::HintTable::SharedObjectTable
- Origami::Integer
- Origami::InteractiveForm
- Origami::InteractiveForm::SigFlags
- Origami::InvalidPDFInstructionError
- Origami::InvalidXRefStreamObjectError
- Origami::LightingScheme3D
- Origami::LightingScheme3D::Styles
- Origami::Linearization
- Origami::Metadata
- Origami::MetadataStream
- Origami::Name
- Origami::NameLeaf
- Origami::NameTreeNode
- Origami::Names
- Origami::Names::Root
- Origami::NavigationNode
- Origami::Node3D
- Origami::Null
- Origami::Number
- Origami::Obfuscator
- Origami::Object
- Origami::ObjectStream
- Origami::Outline
- Origami::OutlineItem
- Origami::OutlineItem::Style
- Origami::OutputIntent
- Origami::OutputIntent::Intent
- Origami::PDF
- Origami::PDF::Header
- Origami::PDF::Instruction
- Origami::PDF::JavaScript
- Origami::PDF::JavaScript::AcroTimer
- Origami::PDF::JavaScript::AcrobatObject
- Origami::PDF::JavaScript::Acrohelp
- Origami::PDF::JavaScript::App
- Origami::PDF::JavaScript::Arg
- Origami::PDF::JavaScript::Console
- Origami::PDF::JavaScript::Data
- Origami::PDF::JavaScript::Doc
- Origami::PDF::JavaScript::Doc::Info
- Origami::PDF::JavaScript::Engine
- Origami::PDF::JavaScript::EngineError
- Origami::PDF::JavaScript::Field
- Origami::PDF::JavaScript::GeneralError
- Origami::PDF::JavaScript::Global
- Origami::PDF::JavaScript::HelpError
- Origami::PDF::JavaScript::Interval
- Origami::PDF::JavaScript::InvalidArgsError
- Origami::PDF::JavaScript::MissingArgError
- Origami::PDF::JavaScript::NotAllowedError
- Origami::PDF::JavaScript::Platforms
- Origami::PDF::JavaScript::ReadStream
- Origami::PDF::JavaScript::TimeOut
- Origami::PDF::JavaScript::TypeError
- Origami::PDF::JavaScript::Util
- Origami::PDF::JavaScript::Viewers
- Origami::PDF::LinearParser
- Origami::PDF::Parser
- Origami::PDF::Revision
- Origami::Page
- Origami::Page::Format
- Origami::PageAdditionalActions
- Origami::PageTreeNode
- Origami::Perms
- Origami::Projection3D
- Origami::Projection3D::ClippingStyles
- Origami::Projection3D::Scaling
- Origami::Real
- Origami::Rectangle
- Origami::Reference
- Origami::Reference3D
- Origami::RenderMode3D
- Origami::RenderMode3D::Modes
- Origami::Requirement
- Origami::Requirement::Handler
- Origami::Requirement::Handler::Type
- Origami::Resources
- Origami::ResourcesHolder
- Origami::Signature
- Origami::Signature::AppData
- Origami::Signature::BuildData
- Origami::Signature::BuildProperties
- Origami::Signature::DigitalSignature
- Origami::Signature::Reference
- Origami::Signature::SigQData
- Origami::Stream
- Origami::String
- Origami::String::Encoding
- Origami::String::Encoding::PDFDocEncoding
- Origami::String::Encoding::UTF16BE
- Origami::Text
- Origami::Text::Rendering
- Origami::Text::State
- Origami::Trailer
- Origami::U3DStream
- Origami::URL
- Origami::UsageRights
- Origami::UsageRights::Rights
- Origami::UsageRights::TransformParams
- Origami::V8
- Origami::V8::Object
- Origami::View3D
- Origami::ViewerPreferences
- Origami::Webcapture
- Origami::Webcapture::Command
- Origami::Webcapture::Command::Flags
- Origami::Webcapture::CommandSettings
- Origami::Webcapture::SourceInformation
- Origami::Webcapture::SourceInformation::SubmissionType
- Origami::Webcapture::SpiderInfo
- Origami::XDP
- Origami::XDP::Package
- Origami::XDP::Packet
- Origami::XDP::Packet::Config
- Origami::XDP::Packet::Config::AdjustData
- Origami::XDP::Packet::Config::Attributes
- Origami::XDP::Packet::Config::Base
- Origami::XDP::Packet::Config::Common
- Origami::XDP::Packet::Config::Data
- Origami::XDP::Packet::Config::Debug
- Origami::XDP::Packet::Config::ExcludeNS
- Origami::XDP::Packet::Config::GroupParent
- Origami::XDP::Packet::Config::IfEmpty
- Origami::XDP::Packet::Config::IncrementalLoad
- Origami::XDP::Packet::Config::Locale
- Origami::XDP::Packet::Config::LocaleSet
- Origami::XDP::Packet::Config::Log
- Origami::XDP::Packet::Config::Message
- Origami::XDP::Packet::Config::Messaging
- Origami::XDP::Packet::Config::Mode
- Origami::XDP::Packet::Config::MsgId
- Origami::XDP::Packet::Config::NameAttr
- Origami::XDP::Packet::Config::OutputXSL
- Origami::XDP::Packet::Config::Picture
- Origami::XDP::Packet::Config::Presence
- Origami::XDP::Packet::Config::Range
- Origami::XDP::Packet::Config::Record
- Origami::XDP::Packet::Config::Relevant
- Origami::XDP::Packet::Config::Rename
- Origami::XDP::Packet::Config::Severity
- Origami::XDP::Packet::Config::StartNode
- Origami::XDP::Packet::Config::StartPage
- Origami::XDP::Packet::Config::SuppressBanner
- Origami::XDP::Packet::Config::Template
- Origami::XDP::Packet::Config::Threshold
- Origami::XDP::Packet::Config::To
- Origami::XDP::Packet::Config::Transform
- Origami::XDP::Packet::Config::URI
- Origami::XDP::Packet::Config::ValidationMessaging
- Origami::XDP::Packet::Config::VersionControl
- Origami::XDP::Packet::Config::Whitespace
- Origami::XDP::Packet::Config::Window
- Origami::XDP::Packet::Config::XSL
- Origami::XDP::Packet::ConnectionSet
- Origami::XDP::Packet::ConnectionSet::EffectiveInputPolicy
- Origami::XDP::Packet::ConnectionSet::EffectiveOutputPolicy
- Origami::XDP::Packet::ConnectionSet::Operation
- Origami::XDP::Packet::ConnectionSet::RootElement
- Origami::XDP::Packet::ConnectionSet::SOAPAction
- Origami::XDP::Packet::ConnectionSet::SOAPAddress
- Origami::XDP::Packet::ConnectionSet::URI
- Origami::XDP::Packet::ConnectionSet::WSDLAddress
- Origami::XDP::Packet::ConnectionSet::WSDLConnection
- Origami::XDP::Packet::ConnectionSet::XMLConnection
- Origami::XDP::Packet::ConnectionSet::XSDConnection
- Origami::XDP::Packet::Datasets
- Origami::XDP::Packet::Datasets::Data
- Origami::XDP::Packet::LocaleSet
- Origami::XDP::Packet::PDF
- Origami::XDP::Packet::Signature
- Origami::XDP::Packet::SourceSet
- Origami::XDP::Packet::StyleSheet
- Origami::XDP::Packet::Template
- Origami::XDP::Packet::Template::AppearanceFilter
- Origami::XDP::Packet::Template::Arc
- Origami::XDP::Packet::Template::Area
- Origami::XDP::Packet::Template::Assist
- Origami::XDP::Packet::Template::Barcode
- Origami::XDP::Packet::Template::Bind
- Origami::XDP::Packet::Template::BindItems
- Origami::XDP::Packet::Template::Bookend
- Origami::XDP::Packet::Template::Boolean
- Origami::XDP::Packet::Template::Border
- Origami::XDP::Packet::Template::Break
- Origami::XDP::Packet::Template::BreakAfter
- Origami::XDP::Packet::Template::BreakBefore
- Origami::XDP::Packet::Template::Button
- Origami::XDP::Packet::Template::Calculate
- Origami::XDP::Packet::Template::Caption
- Origami::XDP::Packet::Template::Certificate
- Origami::XDP::Packet::Template::Certificates
- Origami::XDP::Packet::Template::CheckButton
- Origami::XDP::Packet::Template::ChoiceList
- Origami::XDP::Packet::Template::Color
- Origami::XDP::Packet::Template::Comb
- Origami::XDP::Packet::Template::Connect
- Origami::XDP::Packet::Template::ContentArea
- Origami::XDP::Packet::Template::Corner
- Origami::XDP::Packet::Template::Date
- Origami::XDP::Packet::Template::DateTime
- Origami::XDP::Packet::Template::DateTimeEdit
- Origami::XDP::Packet::Template::Decimal
- Origami::XDP::Packet::Template::DefaultUI
- Origami::XDP::Packet::Template::Desc
- Origami::XDP::Packet::Template::DigestMethod
- Origami::XDP::Packet::Template::DigestMethods
- Origami::XDP::Packet::Template::Draw
- Origami::XDP::Packet::Template::Edge
- Origami::XDP::Packet::Template::Encoding
- Origami::XDP::Packet::Template::Encodings
- Origami::XDP::Packet::Template::Encrypt
- Origami::XDP::Packet::Template::Event
- Origami::XDP::Packet::Template::ExData
- Origami::XDP::Packet::Template::ExObject
- Origami::XDP::Packet::Template::ExclGroup
- Origami::XDP::Packet::Template::Execute
- Origami::XDP::Packet::Template::Extras
- Origami::XDP::Packet::Template::Field
- Origami::XDP::Packet::Template::Fill
- Origami::XDP::Packet::Template::Filter
- Origami::XDP::Packet::Template::Float
- Origami::XDP::Packet::Template::Font
- Origami::XDP::Packet::Template::FormCalcScript
- Origami::XDP::Packet::Template::Format
- Origami::XDP::Packet::Template::Handler
- Origami::XDP::Packet::Template::Hyphenation
- Origami::XDP::Packet::Template::Image
- Origami::XDP::Packet::Template::ImageEdit
- Origami::XDP::Packet::Template::Integer
- Origami::XDP::Packet::Template::Issuers
- Origami::XDP::Packet::Template::Items
- Origami::XDP::Packet::Template::JavaScript
- Origami::XDP::Packet::Template::Keep
- Origami::XDP::Packet::Template::KeyUsage
- Origami::XDP::Packet::Template::Line
- Origami::XDP::Packet::Template::Linear
- Origami::XDP::Packet::Template::LockDocument
- Origami::XDP::Packet::Template::MDP
- Origami::XDP::Packet::Template::Manifest
- Origami::XDP::Packet::Template::Margin
- Origami::XDP::Packet::Template::Medium
- Origami::XDP::Packet::Template::Message
- Origami::XDP::Packet::Template::NumericEdit
- Origami::XDP::Packet::Template::OID
- Origami::XDP::Packet::Template::OIDs
- Origami::XDP::Packet::Template::Occur
- Origami::XDP::Packet::Template::Overflow
- Origami::XDP::Packet::Template::PageArea
- Origami::XDP::Packet::Template::PageSet
- Origami::XDP::Packet::Template::Para
- Origami::XDP::Packet::Template::PasswordEdit
- Origami::XDP::Packet::Template::Pattern
- Origami::XDP::Packet::Template::Picture
- Origami::XDP::Packet::Template::Proto
- Origami::XDP::Packet::Template::Radial
- Origami::XDP::Packet::Template::Reason
- Origami::XDP::Packet::Template::Reasons
- Origami::XDP::Packet::Template::Rectangle
- Origami::XDP::Packet::Template::Ref
- Origami::XDP::Packet::Template::Script
- Origami::XDP::Packet::Template::SetProperty
- Origami::XDP::Packet::Template::SignData
- Origami::XDP::Packet::Template::Signature
- Origami::XDP::Packet::Template::Signing
- Origami::XDP::Packet::Template::Solid
- Origami::XDP::Packet::Template::Speak
- Origami::XDP::Packet::Template::Stipple
- Origami::XDP::Packet::Template::Subform
- Origami::XDP::Packet::Template::SubformSet
- Origami::XDP::Packet::Template::SubjectDN
- Origami::XDP::Packet::Template::SubjectDNs
- Origami::XDP::Packet::Template::Submit
- Origami::XDP::Packet::Template::Text
- Origami::XDP::Packet::Template::TextEdit
- Origami::XDP::Packet::Template::Time
- Origami::XDP::Packet::Template::TimeStamp
- Origami::XDP::Packet::Template::ToolTip
- Origami::XDP::Packet::Template::Traversal
- Origami::XDP::Packet::Template::Traverse
- Origami::XDP::Packet::Template::UI
- Origami::XDP::Packet::Template::Validate
- Origami::XDP::Packet::Template::Value
- Origami::XDP::Packet::Template::Variables
- Origami::XDP::Packet::XDC
- Origami::XDP::Packet::XFDF
- Origami::XDP::Packet::XMPMeta
- Origami::XDP::XDP
- Origami::XFA
- Origami::XFA::ClassMethods
- Origami::XFA::Element
- Origami::XRef
- Origami::XRef::Section
- Origami::XRef::Subsection
- Origami::XRefStream
- Origami::XRefToCompressedObj
- EmptySymbol
- Fixnum
- Hash

No matching classes.

# Origami::Graphics::ImageXObject

### Public Class Methods

from_image_file(path, format = nil) click to toggle source

    # File lib/origami/graphics/xobject.rb, line 628
    def self.from_image_file(path, format = nil)

      if path.respond_to?(:read)
        fd = path
      else
        fd = File.open(File.expand_path(path), 'r').binmode
        format ||= File.extname(path)
        format.slice!(0) if format and format[0,1] == '.'
      end

      if ''.respond_to? :force_encoding
        data = fd.read.force_encoding('binary') # 1.9
      else
        data = fd.read
      end

      fd.close

      image = ImageXObject.new

      raise ArgumentError, "Missing file format" if format.nil?
      case format.downcase
        when 'jpg', 'jpeg', 'jpe', 'jif', 'jfif', 'jfi'
          image.setFilter :DCTDecode
          image.rawdata = data

          image

        when 'jp2','jpx','j2k','jpf','jpm','mj2'
          image.setFilter :JPXDecode
          image.rawdata = data

          image

        when 'jb2', 'jbig', 'jbig2'
          image.setFilter :JBIG2Decode
          image.rawdata = data

          image
      else
        raise NotImplementedError, "Unknown file format: '#{format}'"
      end
    end

### Public Instance Methods

to_image_file() click to toggle source

Converts an ImageXObject stream into an image file data. Output format depends on the stream encoding:

    * JPEG for DCTDecode
    * JPEG2000 for JPXDecode
    * JBIG2 for JBIG2Decode
    * PNG for everything else

    Returns an array of the form [ _format_, _data_ ]

    # File lib/origami/graphics/xobject.rb, line 682
    def to_image_file
      encoding = self.Filter
      encoding = encoding[0] if encoding.is_a? ::Array

      case (encoding && encoding.value)
        when :DCTDecode then [ 'jpg', self.data ]
        when :JBIG2Decode then [ 'jbig2', self.data ]
        when :JPXDecode then [ 'jp2', self.data ]

      else
        raise InvalidColorError, "No colorspace specified" unless self.ColorSpace

        case cs = self.ColorSpace.value
          when Color::Space::DEVICE_GRAY
            colortype = 0
            components = 1
          when Color::Space::DEVICE_RGB
            colortype = 2
            components = 3
          when ::Array
            cstype = cs[0].is_a?(Reference) ? cs[0].solve : cs[0]
            case cstype.value
              when :Indexed
                colortype = 3
                components = 3
                csbase = cs[1].is_a?(Reference) ? cs[1].solve : cs[1]
                lookup = cs[3].is_a?(Reference) ? cs[3].solve : cs[3]

              when :ICCBased
                iccprofile = cs[1].is_a?(Reference) ? cs[1].solve : cs[1]
                raise InvalidColorError,
                  "Invalid ICC Profile parameter" unless iccprofile.is_a?(Stream)

                case iccprofile.N
                  when 1
                    colortype = 0
                    components = 1
                  when 3
                    colortype = 2
                    components = 3
                else
                  raise InvalidColorError,
                    "Invalid number of components in ICC profile: #{iccprofile.N}"
                end
            else
              raise InvalidColorError, "Unsupported color space: #{self.ColorSpace}"
            end
        else
          raise InvalidColorError, "Unsupported color space: #{self.ColorSpace}"
        end

        bpc = self.BitsPerComponent || 8
        w,h = self.Width, self.Height
        pixels = self.data

        hdr = [137, 80, 78, 71, 13, 10, 26, 10].pack('C*')
        chunks = []

        chunks <<
        [
          'IHDR',
          [
            w, h,
            bpc, colortype, 0, 0, 0
          ].pack("N2C5")
        ]

        if self.Intents
          intents =
            case self.Intents.value
              when Intents::PERCEPTUAL then 0
              when Intents::RELATIVE then 1
              when Intents::SATURATION then 2
              when Intents::ABSOLUTE then 3
            else
              3
            end

          chunks <<
          [
            'sRGB',
            [ intents ].pack('C')
          ]

          chunks << [ 'gAMA', [ 45455 ].pack("N") ]
          chunks <<
          [
            'cHRM',
            [
              31270,
              32900,
              64000,
              33000,
              30000,
              60000,
              15000,
              6000
            ].pack("N8")
          ]
        end

        if colortype == 3
          lookup =
            case lookup
              when Stream then lookup.data
              when String then lookup.value
            else
              raise InvalidColorError, "Invalid indexed palette table"
            end

          raise InvalidColorError, "Invalid base color space" unless csbase
          palette = ""

          case csbase.value
            when Color::Space::DEVICE_GRAY
              lookup.each_byte do |g|
                palette << Color.gray_to_rgb(g).pack("C3")
              end
            when Color::Space::DEVICE_RGB
              palette << lookup[0, (lookup.size / 3) * 3]
            when Color::Space::DEVICE_CMYK
              (lookup.size / 4).times do |i|
                cmyk = lookup[i * 4, 4].unpack("C4").map!{|c| c.to_f / 255}
                palette << Color.cmyk_to_rgb(*cmyk).map!{|c| (c * 255).to_i}.pack("C3")
              end
            when ::Array
              case csbase[0].solve.value
                when :ICCBased
                  iccprofile = csbase[1].solve
                  raise InvalidColorError,
                    "Invalid ICC Profile parameter" unless iccprofile.is_a?(Stream)

                  case iccprofile.N
                    when 1
                      lookup.each_byte do |g|
                        palette << Color.gray_to_rgb(g).pack("C3")
                      end
                    when 3
                      palette << lookup[0, (lookup.size / 3) * 3]
                  else
                    raise InvalidColorError,
                      "Invalid number of components in ICC profile: #{iccprofile.N}"
                  end
              else
                raise InvalidColorError, "Unsupported color space: #{csbase}"
              end
          else
            raise InvalidColorError, "Unsupported color space: #{csbase}"
          end

          if iccprofile
            chunks <<
            [
              'iCCP',
              'ICC Profile' + "\x00\x00" + Zlib::Deflate.deflate(iccprofile.data, Zlib::BEST_COMPRESSION)
            ]
          end

          chunks <<
          [
            'PLTE',
            palette
          ]

          bpr = w
        else

          if iccprofile
            chunks <<
            [
              'iCCP',
              'ICC Profile' + "\x00\x00" + Zlib::Deflate.deflate(iccprofile.data, Zlib::BEST_COMPRESSION)
            ]
          end

          bpr = (bpc >> 3) * components * w
        end

        require 'zlib'

        nrows = pixels.size / bpr
        nrows.times do |irow|
          pixels.insert(irow * bpr + irow, "\x00")
        end

        chunks <<
        [
          'IDAT',
           Zlib::Deflate.deflate(pixels, Zlib::BEST_COMPRESSION)
        ]

        if self.Metadata.is_a?(Stream)
          chunks <<
          [
            'tEXt',
            "XML:com.adobe.xmp" + "\x00" + self.Metadata.data
          ]
        end

        chunks << [ 'IEND', '' ]

        [ 'png',
          hdr + chunks.map!{ |chk|
            [ chk[1].size, chk[0], chk[1], Zlib.crc32(chk[0] + chk[1]) ].pack("NA4A*N")
          }.join
        ]
      end
    end

[Validate]

Generated with the Darkfish Rdoc Generator 2.